質問

JavaScript では、Prototype ライブラリを使用して、次のような関数の構築が可能です。

var words = ["aqueous", "strength", "hated", "sesquicentennial", "area"];
words.pluck('length');
//-> [7, 8, 5, 16, 4]

このサンプルコードは以下と同等であることに注意してください。

words.map( function(word) { return word.length; } );

F# でも同様のことができるのではないかと思いました。

let words = ["aqueous"; "strength"; "hated";"sesquicentennial"; "area"]
//val words: string list
List.pluck 'Length' words
//int list = [7; 8; 5; 16; 4]

次のように書く必要はありません。

List.map (fun (s:string) -> s.Length) words

これは、すべてのプロパティにアクセスするために関数を作成する必要がないため、非常に便利だと思います。

役に立ちましたか?

解決

F# メーリング リストであなたのリクエストを拝見しました。お役に立てれば幸いです。

これを可能にするには、型拡張とリフレクションを使用できます。pluck 関数を使用して汎用リスト型を単純に拡張します。そうすれば、任意のリストに対して pluck() を使用できるようになります。不明なプロパティは、エラー文字列のみを内容とするリストを返します。

type Microsoft.FSharp.Collections.List<'a> with
    member list.pluck property = 
        try 
            let prop = typeof<'a>.GetProperty property 
            [for elm in list -> prop.GetValue(elm, [| |])]
        with e-> 
            [box <| "Error: Property '" + property + "'" + 
                            " not found on type '" + typeof<'a>.Name + "'"]

let a = ["aqueous"; "strength"; "hated"; "sesquicentennial"; "area"]

a.pluck "Length" 
a.pluck "Unknown"

これにより、対話型ウィンドウに次の結果が生成されます。

> a.pluck "Length" ;; 
val it : obj list = [7; 8; 5; 16; 4]

> a.pluck "Unknown";;
val it : obj list = ["Error: Property 'Unknown' not found on type 'String'"]

敬具、

ダニー・アッシャー

> > > > >

注記:使用するとき <pre> 周囲の山括弧

<'a>
プレビューウィンドウでは正常に見えましたが、表示されませんでした。バッククォートは私には機能しませんでした。カラー版を頼まなければなりませんでしたが、それはすべて間違っていました。FSharp 構文が完全にサポートされるまで、ここに再度投稿することはないと思います。

他のヒント

プロトタイプの pluck それをJavaScriptで利用します object.method() と同じです object[method].

残念ながら電話はできません String.Length それは静的メソッドではないためです。ただし、次のものを使用できます。

#r "FSharp.PowerPack.dll" 
open Microsoft.FSharp.Compatibility
words |> List.map String.length 

http://research.microsoft.com/fsharp/manual/FSharp.PowerPack/Microsoft.FSharp.Compatibility.String.html

ただし、使用すると、 Compatibility おそらくコードを見ている人をさらに混乱させるでしょう。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top