Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 给定一个(a*b)列表,返回一个(a*b列表)列表_List_F# - Fatal编程技术网

List 给定一个(a*b)列表,返回一个(a*b列表)列表

List 给定一个(a*b)列表,返回一个(a*b列表)列表,list,f#,List,F#,也许是一个时髦的标题,但我有以下问题: 给定一个类型为(a*b)list的列表,我想创建一个类型为(a*b list)list的新列表。例如: 给定list让testList=[(1,“c”);(2,“a”);(1,“b”)],我的函数应该返回[(1,[“c”;(2,[“a”)] 我有以下几点,但我对如何继续有点困惑: let rec toRel xs = match xs with | (a,b)::rest -> (a,[b])::toRel rest | _

也许是一个时髦的标题,但我有以下问题:

给定一个类型为
(a*b)list
的列表,我想创建一个类型为
(a*b list)list
的新列表。例如:

给定list
让testList=[(1,“c”);(2,“a”);(1,“b”)]
,我的函数应该返回
[(1,[“c”;(2,[“a”)]

我有以下几点,但我对如何继续有点困惑:

let rec toRel xs =
    match xs with
    | (a,b)::rest -> (a,[b])::toRel rest
    | _           -> []

您可以使用内置函数
List.groupBy
,然后映射以删除冗余密钥:

testList |> List.groupBy fst |> List.map (fun (k,v) -> (k, List.map snd v))

// val it : (int * string list) list = [(1, ["c"; "b"]); (2, ["a"])]
否则,如果要继续匹配,可以执行以下操作:

let toRel x = 
    let rec loop acc xs =
        match xs with
        | (k, b) :: rest ->
            let acc =
                match Map.tryFind k acc with
                | Some v -> Map.add k (b::v) acc
                | None   -> Map.add k [b] acc
            loop acc rest
        | _             -> acc
    loop Map.empty x |> Map.toList
或者使用
选项。toList
您可以编写它:

let toRel x = 
    let rec loop acc xs =
        match xs with
        | (k, b) :: rest ->
            let acc =
                let lst = Map.tryFind k acc |> Option.toList |> List.concat
                Map.add k (b::lst) acc
            loop acc rest
        | _              -> acc
    loop Map.empty x |> Map.toList

您可以使用
List.groupBy
这是一个非常优雅的解决方案。您有没有建议在不使用高阶函数的情况下使用它?我刚刚添加了一个示例,其中包含一个匹配项,我认为这正是您要做的。但您也可以使用迭代器。