J'ai une fonction qui traite une liste d'entrées dans un type différent, mais cela n'est pas intéressant en soi.F # Transférer un paramètre dans une fonction d'ordre supérieur ou déclarer sa propre fonction
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"])]
Ceci est bien et bon, et peut être remaniée:
testList |> List.groupBy xs |> List.map (fun (k, v) -> (k, list.map snd v))
Ce qui donne le même résultat.
Lorsque j'essaie d'encapsuler ce processus de tuyauterie dans une fonction, je rencontre des problèmes.
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
.
Ce qui donne?
normalement la réponse est de remplacer '|>' '>> avec' –
'List.groupBy' est binaire et vous lui donnez seulement un argument, donc vous redirigez une fonction partiellement appliquée, pas une liste. – ildjarn