F #: Использование List.map для вызова методов в последовательности методов - PullRequest
2 голосов
/ 10 ноября 2011

В основном у меня есть список методов, которые я хочу перебрать, вызвать методы и вернуть список возвращаемых значений метода.Я могу заставить его работать с синтаксисом 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))

Разве это не означает, что метод карты будетвзять в seq <(String -> Int32)>, выполнить итерацию, вызвать каждый метод и вернуть список Int32?

Ответы [ 2 ]

5 голосов
/ 10 ноября 2011

Поскольку methodList является последовательностью в F #, вы не можете рассматривать ее как список (который является одним из ее подтипов). Поэтому убедитесь, что вы используете старшие функции для последовательности и конвертируете результат в список:

member public x.TakeIn(methodList : seq<(String -> Int32)>, input:String) =
    methodList |> Seq.map (fun (item) -> item(input)) |> Seq.toList
3 голосов
/ 10 ноября 2011

List.map требует list <'a>, но вы явно заявляете, что methodList равен seq <..>.Возможные решения:

// 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] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...