使用Haskell中的绑定和lambdas重写do块



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

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' )

但是我无法解开这个谜
我下个薄弱环节要考这个题目。

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

  • do e1 ; e2e1 >> e2相同
  • do x <- e1; e2e1 >>= x -> e2相同

我强烈建议你阅读monad,可能是Haskell的wikibook。

最新更新