2012-03-01 2 views

ответ

5

Это прекрасное место для использования Seq.fold. Он сворачивает коллекцию в одно значение.

Cartesian keys1 keys2 
|> Seq.fold (fun map (i, j) -> 
    let value = (inputd.[i]).[j] 
    Map.add (i, j) value map) Map.empty 
+0

Я просто понял, что. Я не знаю, где была моя голова. – nicolas

5
Cartesian keys1 keys2 
|> Seq.map (fun (i, j) -> ((i, j), (inputd.[i]).[j])) 
|> Map.ofSeq 
5

В дополнение к предыдущим ответам, если вы хотите, чтобы иметь возможность сопоставления с образцом последовательности, можно определить активный шаблон:

let (|Cons|Nil|) s = 
    if Seq.isEmpty s then 
     Nil 
    else 
     Cons(Seq.head s, Seq.skip 1 s) 

let rec addentry map keys = 
    match keys with 
    | Cons((i,j), tail) -> Map.add (i,j) ((inputd.[i]).[j]) (addentry map tail) 
    | Nil -> map 
+0

К сожалению, этот активный шаблон выглядит на несколько порядков медленнее, чем оператор cons cons. –

Смежные вопросы