List.groupBy
は内蔵されていません。組み込み型F#には、その関数のseq版が割り当てられた関数があります。例えばlist.fs
let inline sumBy f (list : list<_>) = Seq.sumBy f list
からIは、F#の設計者は一貫性のため、何DRYのためにのために省略するために複製するかについて多くの議論があったかなり確信しています。私は個人的に彼らがドライで立ち往生したいと思います。
「機能的」なList.groupByを作成したい場合は、mapとlistを使用します。
let groupBy list =
list
|> List.fold (fun group (g, x) ->
match group |> Map.tryFind g with
| Some(s) -> group |> Map.remove g |> Map.add g (x::s)
| None -> group |> Map.add g [x]
) Map.empty
|> Map.toList
let groupsums = groupBy >> List.map (snd >> List.sum)
合計が必要な場合は、リストをスキップすることができます。
let groupAndSumBy list =
list
|> List.fold (fun group (g, x) ->
match group |> Map.tryFind g with
| Some(s) -> group |> Map.remove g |> Map.add g (x + s)
| None -> group |> Map.add g x
) Map.empty
|> Map.toList
|> List.map snd
出力
> groupsums items;;
val it : int list = [25; 10]
> groupAndSumBy items;;
val it : int list = [25; 10]
私は.groupByがない気づい;)しかし、おそらくF#の "魔法" のいくつかの種類を行う方法はありますグループ化を避けてください。また、「自分の.groupを作成するにはマップとリストを使用します」 - リストは何ですか?リストには.mapがありますがリストはありません –
@Sergey可能な解決策を1つ追加しました。 – gradbot
ありがとうございます。パフォーマンスやメモリ使用量に顕著な違いがあると思いますか? –