sách gpt4 ai đã đi

f# - 像Javascript对象一样循环F#记录

In lại 作者:行者123 更新时间:2023-12-04 15:00:25 27 4
mua khóa gpt4 Nike

在 javascript 中,我可以使用简单的 for 循环访问对象的每个属性,如下所示

var myObj = {x:1, y:2};
var i, sum=0;
for(i in myObj) sum = sum + myObj[i];

我想知道我是否可以用 F# 做类似的事情。
type MyObj = {x:int; y:int}
let myObj = {x=1; y=2}
let allValues:seq = allPropertyValuesIn myObj //How do I implement allPropertyValuesIn
let sum = allValues |> Seq.fold (+) 0

谢谢您的意见

编辑以澄清为什么我想做这样的事情
我正在研究 XML 文件生成器。输入是从数据库读取的行,xsd 是预定义的。

假设我需要生成一个“产品”元素,并且根据业务规则,产品下可能有 200 个子元素,有些是必需的,有些是可选的。遵循 this excellent blog 的建议,我有我的第一个(非常粗糙的)产品记录设计:
1. type Product{ Price:Money; Name:Name; FactoryLocation:Address option ... }
2. let product = {Price = Money(1.5); Name = Name ("Joe Tooth Paste"); ... }
3. let child1 = createEl ("Price", product.Price)
..
203. let allChildren = child1
::child2
::child3
..
::[]
404. let prodctEl = createElWithCildren ("Product", allChildren)

这是非常乏味和不简洁的。在 F# 中必须有更好的方法来做这样的事情。我对反射(reflection)的想法也不是很亲近。

有没有其他方法或者我只是做错了?

1 Câu trả lời

尝试这个:

open Microsoft.FSharp.Reflection

type MyObj = {x:int; y:int}
let myObj = {x=1; y=2}
let allValues = FSharpType.GetRecordFields (myObj.GetType())
let sum =
allValues
|> Seq.fold
(fun s t -> s + int(t.GetValue(myObj).ToString()))
0
printfn "%d" sum

然而,正如 John Palmer 所告诫的,做这样的事情并没有太多好的理由。

关于f# - 像Javascript对象一样循环F#记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16976673/

27 4 0
Bài viết được đề xuất: .net - 可移植类库测试
Bài viết được đề xuất: elasticsearch-dsl - elasticsearch_dsl : Generate multiple buckets in aggregation
Bài viết được đề xuất: python - 使用 scipy 的意外置信区间
Bài viết được đề xuất: c - Libelf 会创建损坏的输出文件,即使什么都不做
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com