【问题标题】:Haskell map function with where statement in F#Haskell map 函数与 F# 中的 where 语句
【发布时间】: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 @.
  • 克里斯,感谢您的澄清。

标签: haskell f#


【解决方案1】:

这是 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# 中,@ 是列表连接运算符,:: 是 cons。

F# 中没有运算符部分,所以我使用 lambda (fun)。

【讨论】:

  • 我知道你会在我之前进入...这些天你会参加会议或其他什么,我会打败你! =) 一如既往的好答案。
  • 我很幸运;一些 Intranet IT 更新即将迫使我现在重新启动 :)
【解决方案2】:

让我们让它看起来更像 F#。 :)

let rec subs = function
| [] -> [[]]
| x::xs -> [ for ys in subs xs do
                yield! [ys;x::ys] ]

【讨论】:

    猜你喜欢
    • 2014-03-11
    • 2019-07-01
    • 1970-01-01
    • 2019-02-28
    • 2019-03-22
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多