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