使函数 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))
在实施中:注意确保语法规则正确。 return
和 pure
只是普通的函数,而不是像过程语言中的 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")
我对 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))
在实施中:注意确保语法规则正确。 return
和 pure
只是普通的函数,而不是像过程语言中的 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")