【问题标题】:What's a difference between unary and binary operator parsing in Haskell?Haskell 中的一元和二元运算符解析有什么区别?
【发布时间】:2019-12-24 19:17:55
【问题描述】:

我正在学习一些技术来制作一个非常简单的 Haskell 解析器,用于计算一致性(加法、减法和其他微不足道的操作)。我使用的库是 Parsec。虽然我对二进制计算有所了解,但如果我尝试制作一元运算符函数,例如否定 (~) 的函数,对我来说似乎很难。有一个代码sn-p我用来实现解析乘法:

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

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

【问题讨论】:

    标签: parsing haskell parsec


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-23
      • 2021-04-20
      • 1970-01-01
      • 2020-09-12
      • 1970-01-01
      • 2018-12-05
      • 1970-01-01
      相关资源
      最近更新 更多