2012-03-01 5 views
4

シーケンスをリストに変換する必要のない優れたコードはありますか?F ::のシーケンスのためのcons :: operator?

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) 

答えて

5

Seq.foldを使用するのに最適な場所です。コレクションを1つの値に縮小します。私はちょうどそれを実現

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

:あなたは、パターンマッチ配列にできるようにしたい場合は、以前の回答を補完するものとして – nicolas

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

Cartesian keys1 keys2 
|> Seq.fold (fun map (i, j) -> 
    let value = (inputd.[i]).[j] 
    Map.add (i, j) value map) Map.empty 
は、あなたがアクティブなパターンを定義することができます。私は頭がどこにあるのか知らない。
+0

悲しいことに、このアクティブパターンは、リストのcons演算子よりも桁違いに遅く表示されます。 –

関連する問題