我写了这个函数,它将两个列表合并在一起,但由于我对函数式编程很新,我想知道是否有更好(更简单)的方法呢?
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时为什么会有区别?
您可以使用以下内容
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)