F# 设置为列表 set.fold

F# set to list with set.fold

我正在用 F# 编程,我正在尝试使用 Set.fold.

将一个集合放入一个列表中

到目前为止我做了什么:

let list sa = Set.fold (fun se sa -> sa) [];;

但它似乎并没有将集合放入列表中,而是创建了一个 一组列表到一个列表中。

我可以对我的代码进行哪些更改,以便它不会将一组列表变成列表,而是将集合变成列表。

let toList s = Set.fold (fun l se -> se::l) [] s

fold 的第一个参数是采用两个参数的函数:类型的累加器应从 fold(在您的情况下为 list)returned,以及集合 fold 的单个元素适用于(在您的情况下是 Set 的元素)。此函数应 return 与作为第一个参数传递的累加器的类型相同(在您的情况下为 list )。所以函数应该将集合的当前元素添加到列表累加器。

fold 的第二个参数是初始累加器状态(在您的情况下为空 list)。

fold 的第 3 个参数在您的例子中是您要转换为 list

的集合

使用 Set.fold 您将收到相反顺序的物品:

let list sa =  sa |> Set.fold (fun se sacc -> sacc::se) [] |> List.rev

或者,使用Set.fold返回:

let list2 sa =  Set.foldBack (fun se sacc -> se::sacc) sa []

示例:

let list sa =  sa |> Set.fold (fun se sacc -> sacc::se) [] |> List.rev
let list2 sa =  Set.foldBack (fun se sacc -> se::sacc) sa []

let set = [1 ; 12; 6 ;8 ; 4] |> Set.ofList

set |> printfn "%A"

list set |> printfn "%A"
list2 set |> printfn "%A"

打印:

set [1; 4; 6; 8; 12]
[1; 4; 6; 8; 12]
[1; 4; 6; 8; 12]

Link:

https://dotnetfiddle.net/xwLMIp

P.S。有一个标准函数Set.toList