7

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 個の子要素が存在する可能性があるとします。一部は必須で、一部はオプションです。この優れたブログからのアドバイスに従って、私は製品レコードの最初の (非常にラフな) デザインを作成しました。

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# でそのようなことを行うためのより良い方法が必要です。私もリフレクションのアイデアにはあまり親しみがありません。

他のアプローチはありますか、それとも間違っていますか?

4

1 に答える 1

7

これを試して:

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 が忠告しているように、このようなことを行う十分な理由はあまりありません。

于 2013-06-07T05:50:14.740 に答える