合并F#中的两个列表

Jam*_*mes 0 f#

我写了这个函数,它将两个列表合并在一起,但由于我对函数式编程很新,我想知道是否有更好(更简单)的方法呢?

let a = ["a"; "b"; "c"]
let b = ["d"; "b"; "a"]

let merge a b =
    // take all a and add b
    List.fold (fun acc elem -> 
                     let alreadyContains = acc |> List.exists (fun item -> item = elem)
                     if alreadyContains = true then
                        acc
                     else 
                        elem :: acc |> List.rev
                     ) b a                

let test = merge a b 
Run Code Online (Sandbox Code Playgroud)

预期结果是:["a"; "B"; "C"; "d"],我正在恢复列表以保持原始顺序.我以为我可以使用List.foldBack(并删除List.rev)来实现相同的效果,但它会导致错误:

类型不匹配.期待'a
但给定'一个列表
当统一''a'和''列表'时,结果类型将是无限的

使用foldBack时为什么会有区别?

Pat*_*ald 7

您可以使用以下内容

let merge a b =
    a @ b
    |> Seq.distinct
    |> List.ofSeq
Run Code Online (Sandbox Code Playgroud)

请注意,这将保留顺序并删除任何重复项.

在F#4.0中,这将简化为

let merge a b = a @ b |> List.distinct
Run Code Online (Sandbox Code Playgroud)