F# でプロトタイプの Enumerable#pluck?
-
09-06-2019 - |
質問
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
ただし、使用すると、 Compatibility
おそらくコードを見ている人をさらに混乱させるでしょう。
所属していません StackOverflow