簡體   English   中英

F#將函數轉換為使用高階函數

[英]F# Transforming function into using higher-order functions

我有這一系列的功能, 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.fold與初始化為[]的精度一起使用,而不是使用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 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM