我正在学习一些技术,以制作一个非常简单的Haskell解析器,该解析器用于计算一致性(加法,减法和其他琐碎运算)。我使用的库是Parsec。尽管我对二进制计算有一定的了解,但是如果我尝试创建一元运算符函数(例如,否定(〜)),对我来说似乎很难。我使用一个代码片段来实现乘法解析:
import Text.Parsec hiding(digit)
import Data.Functor
type Parser a = Parsec String () a
digit :: Parser Char
digit = oneOf ['0'..'9']
number :: Parser Integer
number = read <$> many1 digit
applyMany :: a -> [a -> a] -> a
applyMany x [] = x
applyMany x (h:t) = applyMany (h x) t
multiplication :: Parser Integer
multiplication = do
lhv <- number
spaces
char '*'
spaces
rhv <- number
return $ lhv * rhv
切换到一元运算后,我的阶乘代码如下:
fact :: Parser Integer
fact = do
spaces
char '!'
rhv <- number
spaces
return $ factorial rhv
factorial :: Parser Integer -> Parser Integer
factorial n
| n == 0 || n == 1 = 1
| otherwise = n * factorial (n-1)
一旦加载模块,就会显示一条错误消息,如下所示:
Couldn't match type `Integer'
with `ParsecT String () Data.Functor.Identity.Identity Integer'
Expected type: Parser Integer
Actual type: Integer
令人困惑的是,很难理解我对一元运算与二进制运算比较的理解。希望能帮助您解决此问题。
答案 0 :(得分:4)
factorial
未定义解析器;它计算阶乘。类型应该仅为Integer -> Integer
,而不是Parser Integer -> Parser Integer
。