入力リストを別のタイプに処理する関数がありますが、それ自体はここでは興味深いものではありません。
let testList = [(1,"c");(2,"a");(1,"b")]
let rec toRel xs =
let rec insert (a, b) ys =
match ys with
| [] -> [(a, [b])]
| (a', b')::ys' when a' = a -> (a', b::b')::ys'
| y::ys' -> y::insert (a, b) ys'
match xs with
| [] -> []
| (a,b)::rest -> insert (a, b) (toRel rest)
toRel testList //Expected [(1, ["c";"b"]); (2, ["a"])]
これはよくて良いことであり、次のようにリファクタリングできます。
testList |> List.groupBy xs |> List.map (fun (k, v) -> (k, list.map snd v))
同じ結果が得られます。
この配管プロセスを関数にカプセル化しようとすると、問題が発生します。
let toRelHigherOrder xs = List.groupBy xs |> List.map (fun (k, v) -> (k, list.map snd v))
toRelHigherOrder testList
This expression was expected to have type ''a -> 'b' but here has type '(int * string) list
。
何が得られますか?
私はあなたのパイプが間違っていると思います、それは次のようになります:
testList |> List.groupBy fst |> List.map (fun (k, v) -> (k, List.map snd v))
したがって、関数は次のようになります。
let f x = x |> List.groupBy fst |> List.map (fun (k, v) -> (k, List.map snd v))
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加