【发布时间】:2011-02-15 02:01:29
【问题描述】:
我正在尝试将此 haskell 函数移植到 F#
subs :: [a] -> [[a]]
subs [] = [[]]
subs (x:xs) = ys ++ map (x:) ys
where
ys = subs xs
例子
子 [1,2,3]
返回:
[[],[3],[2],[2,3],[1],[1,3],[1,2],[1,2,3]]
返回列表的所有子序列,这些子序列由排除或包含每个元素的所有可能组合给出
....
我遇到了“where”语句的问题,该语句会递归生成另一个列表“ys”。
我也不确定是否将谓词“(x:)”正确地移植到“(fun i -> i)”。
这是我能想到的 F# 语句。
let rec subs list =
match list with
| [] -> [[]]
| x::xs -> List.map (fun i -> i) xs
任何帮助或指导将不胜感激。
【问题讨论】:
-
只是一个旁注,这是一个集合的力量。
-
另外,请注意,在 Haskell 中,这可以简单地写成
import Control.Monad; subs = filterM $ const [False, True] -
(x:)不是谓词,它是一个“节”表达式(基本上是:运算符的部分应用),相当于(\ys -> x:ys),或者在F# 中,@987654327 @. -
克里斯,感谢您的澄清。