list - F#中列表的所有选择-更优雅,更简单

标签 list f# functional-programming simplify

有人可以提出更好和/或更优雅的实现方式:

让每个xs =
让REC的每个acc左,右=
与之匹配
| []-> acc
|右-> let new_left =左@ [List.hd右]
让next = List.tl对
让结果=(List.hd右),左@下一个
每个'(结果:: acc)new_left下一个
每个'[] [] xs

它这样做:

>每个[1..3] ;;
val it:(int * int list)list = [(3,[1; 2]); (2,[1; 3]); (1,[2; 3])]

此函数也可以反向返回结果。想法是将所有元素作为元组包含元素和其余元素列表。

最佳答案

此处的语义略有不同,但是从您提供的Set的示例可能很合适:

let each xs =
    let X = set xs                           
    [ for x in xs -> (x, X - set [x]) ]


> fsi.AddPrinter( fun (x:Set<int>) -> sprintf "%A" (Set.to_list x))
> each [1..3];;
> val it : (int * Set<int>) list = [(1, [2; 3]); (2, [1; 3]); (3, [1; 2])]

// Edited as per comments.

关于list - F#中列表的所有选择-更优雅,更简单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1189563/

相关文章:

java - 服务器响应 JSON 字符串列表解析

python - 访问列表的多个元素知道它们的索引

asynchronous - F# 中异步操作的顺序执行链接

haskell - 确保异构列表包含一个类型类

python 返回列表中的重复项

c# - 对于两个列表中的每个元素

f# - F# 中的教会数字

asynchronous - 在异步上下文中读取文件?

haskell - 使用 Haskell 的类型系统实现正确的抽象

python - 在 Python 中使用闭包和动态定义的函数是一种自然的设计模式吗?