在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是预定义的。
假设我有一个&#34;产品&#34;需要生成元素,并且根据业务规则,产品下可能有200个子元素,有些是必需的,有些是可选的。根据{{3}}的建议,我有第一个(非常粗略)的产品记录设计:
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#中有更好的方法来做这样的事情。我对反思的想法也不是很了解。
还有其他方法,或者我做错了吗?
答案 0 :(得分:5)
试试这个:
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
然而,正如约翰·帕尔默所说,做这样的事情的理由并不是很多。