Haskell中的一元运算符和二进制运算符解析有什么区别?

时间:2019-12-24 19:17:55

标签: parsing haskell parsec

我正在学习一些技术,以制作一个非常简单的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

令人困惑的是,很难理解我对一元运算与二进制运算比较的理解。希望能帮助您解决此问题。

1 个答案:

答案 0 :(得分:4)

factorial未定义解析器;它计算阶乘。类型应该仅为Integer -> Integer,而不是Parser Integer -> Parser Integer