我正在尝试将此haskell函数移植到F#
subs :: [a] -> [[a]]
subs [] = [[]]
subs (x:xs) = ys ++ map (x:) ys
where
ys = subs xs
例如
subs [1,2,3]
返回:
[[],[3],[2],[2,3],[1],[1,3],[1,2],[1,2,3]]
返回列表的所有子序列,由排除或包含每个元素的所有可能组合给出
...
我遇到'where'语句的问题,它以递归方式生成另一个列表'ys'。
我也不确定我是否正确地将谓词'(x :)'移植到'(有趣的i - > i)'。
这是我能弄清楚的F#声明。
let rec subs list =
match list with
| [] -> [[]]
| x::xs -> List.map (fun i -> i) xs
非常感谢任何帮助或指示。
答案 0 :(得分:7)
这是F#:
let rec subs list =
match list with
| [] -> [[]]
| x::xs ->
let ys = subs xs
ys @ List.map (fun t -> x::t) ys
printfn "%A" (subs [1;2;3])
Haskell where
就像移动到底部的let
一样。
在F#中,@
是列表并置运算符,::
是缺点。
F#中没有运算符部分,所以我使用lambda(fun
)。
答案 1 :(得分:5)
让我们看起来更像F#。 :)
let rec subs = function
| [] -> [[]]
| x::xs -> [ for ys in subs xs do
yield! [ys;x::ys] ]