cons :: оператор для последовательностей в F #? - PullRequest
4 голосов
/ 01 марта 2012

Есть ли лучший код, который не должен преобразовывать последовательность в список?

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)

Ответы [ 3 ]

5 голосов
/ 01 марта 2012
Cartesian keys1 keys2
|> Seq.map (fun (i, j) -> ((i, j), (inputd.[i]).[j]))
|> Map.ofSeq
5 голосов
/ 02 марта 2012

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

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
5 голосов
/ 01 марта 2012

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

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