2

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

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

4

2 に答える 2

2

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 "長さ" ;;
val it : obj リスト = [7; 8; 5; 16; 4]

> a.pluck "不明";;
val it : obj list = ["エラー: プロパティ 'Unknown' がタイプ 'String' で見つかりません"]

敬具、

ダニー・アッシャー

> > > > >

注: <pre>を使用する場合

<'a>
プレビューウィンドウでは問題なく表示されましたが、表示されませんでした。バックティックはうまくいきませんでした。すべて間違っている色付きのバージョンに頼らなければなりませんでした。FSharp 構文が完全にサポートされるまで、ここに再度投稿することはないと思います。

于 2008-09-17T18:19:21.930 に答える
1

プロトタイプは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すると、コードを見ている人にとっては混乱を招く可能性があります。

于 2008-09-17T03:01:17.940 に答える