F Sharp将元组列表转换为映射元组列表

Kag*_*sen 4 f# functional-programming

声明一个将对列表转换为Relation的函数.

type Relation<'a,'b> = ('a * 'b list) list
Run Code Online (Sandbox Code Playgroud)

基本上,转这个:

[(2,"c");(1,"a");(2,"b")]
Run Code Online (Sandbox Code Playgroud)

进入这个:

[(2,["c";"b"]);(1,["a"])]
Run Code Online (Sandbox Code Playgroud)

以这种形式:

toRel:(’a*’b) list -> Rel<’a,’b> 
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?这不是家庭作业,只是自学,这个让我有点难过,考虑到形式不允许积累.

sgt*_*gtz 7

[(2,"c");(1,"a");(2,"b")]
|> List.groupBy fst
|> List.map (fun (x,y)->x,List.map snd y)
Run Code Online (Sandbox Code Playgroud)

结果:

[(2, ["c"; "b"]); (1, ["a"])]
Run Code Online (Sandbox Code Playgroud)

对于toRel位,类型推断很方便:

let toRel xs = 
  xs
  |> List.groupBy fst
  |> List.map (fun (x,y)->x,List.map snd y)
Run Code Online (Sandbox Code Playgroud)

用法:

toRel [(2,"c");(1,"a");(2,"b")]
Run Code Online (Sandbox Code Playgroud)