2011-11-10 6 views
2

基本的には、反復処理を行い、メソッドを呼び出し、メソッドの戻り値のリストを返すメソッドのリストがあります。私はそれをLinqの構文で動作させることができます。F#:List.mapを使用してメソッドのseqでメソッドを呼び出す

member public x.TakeIn(methodList : seq<(String -> Int32)>, input:String) = 
    methodList.Select((fun (item:String -> Int32) -> item(input))).ToList() 

しかし、私はF#の構文知識の欠如であると推測しているマップもあまりにも仕事を得ることができません。

member public x.TakeIn(methodList : seq<(String -> Int32)>, input:String) = 
    methodList |> List.map (fun (item) -> item(input)) 

は、マップ・メソッドは、配列<にかかることを意味するものではないことを(文字列 - >のInt32)が>、反復処理、各メソッドを呼び出し、のInt32のリストを返しますか?

+0

C#バージョンの 'ToList'を削除すると、同じ問題が発生することに注意してください。 – Benjol

答えて

5

methodListはF#のシーケンスなので、リスト(サブタイプの1つ)として扱うことはできません。ですから、シーケンスのための高次機能を使用していることを確認し、リストに結果を変換します。

member public x.TakeIn(methodList : seq<(String -> Int32)>, input:String) = 
    methodList |> Seq.map (fun (item) -> item(input)) |> Seq.toList 
3

List.mapは、リスト<「>を必要としていますが、明示的にmethodListは、配列<...>であることを宣言します。可能な解決策:

// 1. type of methods will be inferred as list 
let takeIn (methods, input : string) : int list = 
    methods 
    |> List.map (fun f -> f input) 
// 2. explicitly convert result to list 
let takeIn (methods, input : string) : int list = 
    methods 
    |> Seq.map (fun f -> f input) 
    |> Seq.toList 
// 3. same as 2 but using list sequence expressions 
let takeIn (methods, input : string) : int list = [for f in methods do yield f input]