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

What's a difference between unary and binary operator parsing in Haskell?

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

令人困惑的是,我很难意识到我对一元操作的理解有什么问题,将它们与二进制操作进行比较。希望有任何帮助来解决这个问题。

factorial 没有定义解析器;它计算阶乘。类型应该只是 Integer -> Integer,而不是 Parser Integer -> Parser Integer.