5

是否有更好的代码不需要将序列转换为列表?

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

addentry Map.empty (Cartesian keys1 keys2 |> Seq.toList)
4

3 回答 3

5
Cartesian keys1 keys2
|> Seq.map (fun (i, j) -> ((i, j), (inputd.[i]).[j]))
|> Map.ofSeq
于 2012-03-01T16:32:12.910 回答
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
于 2012-03-01T16:23:11.137 回答
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
于 2012-03-02T11:28:41.677 回答