Haskell映射函数与F#中的where语句

时间:2009-12-18 18:05:13

标签: haskell f#

我正在尝试将此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

非常感谢任何帮助或指示。

2 个答案:

答案 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] ]