我有这样的函数:
我想使用一个
eval :: Expr -> Either ArithmeticError Int
eval (Const a) = Right a
eval (Add a b) = liftM2 (+) ea eb
where
ea = eval a
eb = eval b
eval (Sub a b) = liftM2 (-) ea eb
where
ea = eval a
eb = eval b
我想使用一个
where
来重写这段代码,可以吗?但是模式匹配应该保留在代码中。谢谢!
_eval f a b = liftM2 f (eval a) (eval b)
,然后指定eval (Add a b) = _eval (+) a b
和eval (Sub a b) = _eval (-) a b
呢? - Willem Van OnsemData.Function.on
:eval (Add a b) = liftM2 (+) `on` eval
。 (说明:Data.Function.on
是一个高阶函数,它可以将一个二元函数转换成一个以某个函数为参数的函数。在这里,on
被用于组合liftM2
和eval
函数,使得(+)
可以作用于eval
的结果上) - chepnereval (Add a b) = liftM2 (+) (eval a) (eval b)
有什么问题? - lsmor