使函数 return 不同类型 haskell

Make function return different types haskell

我对 haskell 完全陌生。我需要一个 returns 运算符或 returns 字符串形式的错误消息的函数。对于上下文,我正在构建一个接受双打的 Monadic 解析器。

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"

那只是一个解析器。它需要输入来决定输出是运算符还是错误字符串。所以签名必须是

mulop :: Parser (Either (Double -> Double -> Double) String)

实际上有一些约定,当使用 Either 作为异常添加类型时,错误消息应该在 Left 上,所以最好把它写成

mulop :: Parser (Either String (Double -> Double -> Double))

在实施中:注意确保语法规则正确。 returnpure 只是普通的函数,而不是像过程语言中的 return 这样的特殊关键字。所以需要 return $ Left (**).

还要确保缩进正确。我会这样调整:

mulop = do symbol "^" 
           return $ Right (**)
    +++ do symbol "*" 
           return $ Right (*)
    +++ do symbol "/" 
           return $ Right (/)
    +++ pure (Left "ERROR MSG")

或者,不要使用do表示法。你真的不需要任何单子在这里,你可以使用 <$ operator:

mulop = (Right (**) <$ symbol "^")
    +++ (Right (*) <$ symbol "*")
    +++ (Right (/) <$ symbol "/")
    +++ pure (Left "ERROR MSG")