【问题标题】:Rewriting a do-block using bindings and lambdas in Haskell在 Haskell 中使用绑定和 lambda 重写 do-block
【发布时间】:2020-09-28 17:00:15
【问题描述】:

我的教授给了我以下任务:

data Expr = Num Double | Add Expr Expr

evalDo :: Expr -> Maybe Double
evalDo (Num a) = if a < 0 then Nothing else return a 
evalDo (Add a b) = do 
                    x <- evalDo a
                    y <- evalDo b
                    return (x + y)

仅使用 (>>=) 和 lambda 表达式重写此函数。
这是我拥有要使用的模板:

evalBd :: Expr -> Maybe Double
evalBd (Num a) = if a < 0 then Nothing else return a 
evalBd (Add a b) = _____ a >>= _____ _____ -> _____ _____ >>= \b' -> _____ (a' + _____ )

必须填写空白。我的想法类似于...

evalBd (Add a b) = evalBd a >>= \b' _____ -> _____ _____ >>= \b' -> return (a' + b' )

但我无法解开这个谜题。
我正在做一个关于这个主题的考试。

【问题讨论】:

  • 我相信\b' 分别填入-&gt; 左侧的一个空白处,您将把它们放在同一个空白处。恐怕这对你的教授来说不是一个写得很好的问题。
  • 或者更确切地说,a' 也应该是第一个函数的参数; a'evalDo a(以前称为x)的结果,b'evalDo b(以前称为y)的结果。
  • 你不能\b' 两次,使用另一个变量。您在 do 块中使用了 xy。请注意,在 ____ ____ 中,第一个空格可以是 ` \ `,第二个空格可以是变量名称,例如您的 b'

标签: haskell binding monads


【解决方案1】:

一旦你得到它就很简单了。我不会给你确切的答案,而是你需要什么来解决它。以下是您需要了解的内容:

  • do e1 ; e2e1 &gt;&gt; e2 相同
  • do x &lt;- e1; e2e1 &gt;&gt;= \x -&gt; e2 相同

我强烈建议您阅读 monads,可能是 Haskell wikibook。

【讨论】:

    猜你喜欢
    • 2023-03-19
    • 1970-01-01
    • 2014-03-26
    • 1970-01-01
    • 2013-06-06
    • 2019-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多