list - F# 将函数转换为使用高阶函数

标签 list f#

我有这一系列函数,isMemberaddElemcountries:

let rec isMember x = function
    | y::ys -> y=x || (isMember x ys)
    | []    -> false

let addElem x ys = if isMember x ys then ys else x::ys

let rec countries = function
    | []         -> []
    | (c1,c2)::m -> addElem c1 (addElem c2 (countries m))

我想使用高阶函数重写国家,但我不完全确定如何:

我的猜测是它与 List.map 有关,因为我正在对列表的每个元素应用一个函数。

let countriesHigherOrder m = 
    List.map (fun x -> addElem x m)

最佳答案

除了使用 List.map,您可以将 List.fold 与您初始化为 [] 的 accu 一起使用,并将元素添加到 accu。

let countriesHigherOrder m = 
    List.fold (fun acc (c1,c2) -> addElem c1 (addElem c2 acc)) [] m

或通过定义 addPair:

let addPair (x, y) ys =
   addElem x (addElem y ys)   


let countriesHigherOrder m = 
    List.fold (fun acc (c1,c2) -> addPair (c1, c2) acc) [] m

关于list - F# 将函数转换为使用高阶函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47018256/

相关文章:

无法推到列表后面

c# - 从特定的 listindex 到 c# 中的列表末尾对 List<byte[]> 进行排序

r - 删除列表中数据框中的一列

java - 对字符串的链接列表进行词法排序

list - 从F#中的列表中删除Nans

f# - WebSharper浏览器的最低要求

python - 更改范围之外的列表

r - 如何在 R 中实现 F# 的正向管道运算符?

f# - 在 F# 中 >> 运算符是什么意思?

types - F# 使用柯里化(Currying)函数进行类型推断