gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:00:25 27 4
gpt4 key购买 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<int> = 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)的想法也不是很亲近。

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

最佳答案

尝试这个:

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
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com