F#:使用List.map调用seq方法中的方法

时间:2011-11-10 17:26:47

标签: generics f#

基本上我有一个方法列表,我想迭代,调用方法,并返回方法返回值列表。我可以使用Linq语法。

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))

这不是暗示map方法将接受seq&lt;(String - &gt; Int32)&gt;,迭代,调用每个方法,并返回Int32列表?

2 个答案:

答案 0 :(得分:5)

因为methodList是F#中的序列,所以不能将其视为列表(它是其子类型之一)。因此,请确保对序列使用高阶函数并将结果转换为列表:

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

答案 1 :(得分:3)

List.map需要列表&lt;'a&gt;但你明确声明methodList是seq&lt; ..&gt;。可能的解决方案:

// 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]