Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 什么';Haskell中一元运算符和二元运算符的解析有什么区别?_Parsing_Haskell_Parsec - Fatal编程技术网

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

Parsing 什么';Haskell中一元运算符和二元运算符的解析有什么区别?,parsing,haskell,parsec,Parsing,Haskell,Parsec,我正在学习一些技术来制作一个非常简单的Haskell解析器,用于计算一致性(加法、减法和其他琐碎的操作)。我使用的库是Parsec。虽然我对二进制计算有了一些理解,但如果我尝试制作一元运算符函数,例如否定(~)的函数,对我来说似乎很难。我使用一个代码段来实现乘法解析: import Text.Parsec hiding(digit) import Data.Functor type Parser a = Parsec String () a digit :: Parser Char digi

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

令人困惑的是,将一元运算与二元运算进行比较,我很难意识到我对一元运算的理解有何错误。希望能帮上忙

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

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