【发布时间】:2021-12-01 06:23:53
【问题描述】:
我对 haskell 完全陌生。我需要一个返回运算符或以字符串形式返回错误消息的函数。对于上下文,我正在构建一个接受双精度的 Monadic Parser。
term'::Parser Double
term' = factor' `chainl1` mulop
addop, mulop :: Parser (Double -> Double -> Double)
mulop = do symbol "^"
return (**)
+++ do symbol "*"
return (*)
+++ do symbol "/"
return (/)
addop = do symbol "+"
return (+)
+++ do symbol "-"
return (-)
上面的代码可以很好地返回运算符,但是当我尝试通过添加错误消息来扩展它时,我得到了编译错误。以下是我正在尝试的。
mulop :: Either (Parser (Double -> Double -> Double)) (Parser String)
mulop = do symbol "^"
return Left (**)
+++ do symbol "*"
return Left (*)
+++ do symbol "/"
return Left (/)
+++ pure Right "ERROR MSG"
【问题讨论】:
-
return Left (**)应该是return (Left (**))(或return $ Left (**))。否则你用两个单独的参数调用return,Left和(**),这是没有意义的。 -
为什么不打电话给
fail "ERROR MSG"? -
思路是按照上述方式处理,不引发异常