我试图将这个haskell函数移植到F#
subs        ::  [a] -> [[a]]
subs []     =   [[]]
subs (x:xs) =   ys ++ map (x:) ys
                where 
                   ys = subs xs
Run Code Online (Sandbox Code Playgroud)
例
潜艇[1,2,3]
收益:
[[],[3],[2],[2,3],[1],[1,3],[1,2],[1,2,3]]
返回列表的所有子序列,由排除或包括每个元素的所有可能组合给出
....
我遇到'where'语句的问题,它递归地生成另一个列表'ys'.
我也不确定我将谓词'(x :)'正确地移植到'(有趣的是我 - >我)'.
这是我能弄清楚的F#声明.
let rec subs list =
    match list with
        | [] -> [[]]
        | x::xs -> List.map (fun i -> i) xs
Run Code Online (Sandbox Code Playgroud)
任何帮助或方向将不胜感激.
这是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])
Run Code Online (Sandbox Code Playgroud)
Haskell where就像let移动到底部一样.  
在F#中,@是列表连接运算符,并且::是缺点.
F#中没有运算符部分,所以我使用lambda(fun).
让我们看起来更像F#.:)
let rec subs = function
| [] -> [[]]
| x::xs -> [ for ys in subs xs do
                yield! [ys;x::ys] ]
Run Code Online (Sandbox Code Playgroud)