【问题标题】:F# Transforming function into using higher-order functionsF# 将函数转换为使用高阶函数
【发布时间】:2017-10-31 07:56:04
【问题描述】:

我有这一系列函数,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 f#


    【解决方案1】:

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

    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
    

    【讨论】:

    • 可以说let countriesHigherOrder m = List.fold (fun acc (c1,c2) -> addElem (c1,c2) acc) [] m吗?
    • 是的,这是可能的。我用 addPair 替换了 addElem。 addPair 调用 addElem 以避免区分大小写。
    【解决方案2】:

    如果你想将一个对的列表扁平化为一个简单的列表,同时只保留一个相同元素的出现,最短的代码将涉及到 append 运算符。

    let countries' m =
        List.unzip m ||> (@)
        |> Seq.distinct
        |> Seq.toList
    

    另一方面,如果您需要双递归方法的特殊顺序,则可以将元组列表转换为二元素列表并将它们连接起来。

    let countries'' m =
        List.rev m
        |> List.collect(fun (x,y) -> [y;x])
        |> Seq.distinct
        |> Seq.toList
        |> List.rev
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多