3

プロトタイプのタプルをレコードにアップグレードしました。いつか本当のクラスになるかもしれません。それまでの間、次のようなコードを翻訳したいと思います。

type Example = int * int
let examples = [(1,2); (3,4); (5,6)]
let descs = Seq.map (fst >> sprintf "%d") examples

これに:

type Example = {
  Field1 : int
  Field2 : int
  Description : string
}
let examples = [{Field1 = 1; Field2 = 2; Description = "foo"}
                {Field1 = 3; Field2 = 4; Description = "bar"}
                {Field1 = 5; Field2 = 6; Description = "baz"}]
let descs = Seq.map Description examples

Description : Example -> string問題は、Example レコードを宣言したときに関数を取得できると思っていたのに、取得できなかったことです。私は少し突っ込んでクラスのプロパティを試しましたが、それもうまくいきません。ドキュメントに何かが欠けているだけですか、それとも高次のアクセサーを手動で作成する必要がありますか? (それが私が現在使用している回避策です。)

4

2 に答える 2

9

F# でインスタンス メンバーを関数値として使用する何らかの方法があれば (ラムダ関数を明示的に構築することなく) 便利だと思います。これは、実際に F# コミュニティで数回議論されています。関連するリンクの 1 つを次に示します。

その議論からいくつかの提案されたオプションは次のとおりです。

// This would turn '_' automatically into a lambda parameter
// (this looks okay in simple cases, but doesn't probably scale well)
examples |> Seq.map (_.Description)

// You would specify instance member using special '#' symbol
examples |> Seq.map (Example#Description)

したがって、これは F# チームが認識していることですが、これが実際に重要な機能であるかどうか、またそれをサポートする最善の方法は何かという結論は出ていないと思います。

于 2010-06-08T01:32:30.953 に答える
0
examples |> Seq.map (fun e -> e.Description)

(レコードを宣言しても関連する関数は作成されませんが、レコードにはプロパティがあるため、上記のような小さなラムダにより、特定のフィールドを簡単に射影できます。)

于 2010-06-07T20:52:37.270 に答える