cons::F#中序列的运算符?
是否有更好的代码不需要将序列转换为列表cons::F#中序列的运算符?,f#,sequence,cons,cdr,F#,Sequence,Cons,Cdr,是否有更好的代码不需要将序列转换为列表 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) 这是一个很好的使用Seq.fold的
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)
这是一个很好的使用
Seq.fold
的地方。它将集合向下折叠为单个值
Cartesian keys1 keys2
|> Seq.fold (fun map (i, j) ->
let value = (inputd.[i]).[j]
Map.add (i, j) value map) Map.empty
作为对前面答案的补充,如果您希望能够对序列进行模式匹配,可以定义一个活动模式:
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
我才意识到。我不知道我的头在哪里。遗憾的是,这个活动模式似乎比列表的cons操作符慢几个数量级。
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