使用uu-parsinglib解析一系列Word8

时间:2015-07-21 14:04:15

标签: haskell uu-parsinglib

我正在尝试使用uu-parsinglib来操作[Word8]而不是[Char]。 (我想使用uu-parsinglib进行错误报告。) 我需要一个解析器来获取序列中的下一个Word8,无论它是什么。 有了这个,我可以构建更复杂的解析器。 但我无法弄清楚如何写它。 我能得到的最接近的是:

{-# LANGUAGE FlexibleContexts #-}

module Main where

import Control.Applicative ((<|>))
import Data.Word
import Text.ParserCombinators.UU.BasicInstances

pRawWord8 :: Parser Word8
pRawWord8 = pSatisfy (const True) (Insertion undefined undefined undefined)

但是,该实现显然返回了错误的类型。

amy2.hs:10:13:
    Couldn't match type ‘Char’ with ‘Word8’
    Expected type: Text.ParserCombinators.UU.Core.P
                     (Str Char state loc) Word8
      Actual type: Text.ParserCombinators.UU.Core.P
                     (Str Char state loc) Char
    In the expression:
      pSatisfy (const True) (Insertion undefined undefined undefined)
    In an equation for ‘pRawWord8’:
        pRawWord8
          = pSatisfy (const True) (Insertion undefined undefined undefined)

这让我感到惊讶,因为我看不到pSatisfy的类型签名限制我如何回复Char而不是Word8

如何实施pRawWord8

1 个答案:

答案 0 :(得分:1)

pSatisfy有类型:

pSatisfy :: forall loc state a. (Show a, loc `IsLocationUpdatedBy` a, ListLike state a) => (a -> Bool) -> Insertion a -> P (Str a state loc) a

因此Parser返回与输入(a)相同的类型。由于Parser是

type Parser a = (IsLocationUpdatedBy loc Char, ListLike state Char) => P (Str Char state loc) a

Parser的输入是Char的ListLike,因此pSatisfy只能返回Parser Char。所以类型确实禁止你尝试做的事情。

也许您应该将您的功能输入为

pRawWord8 :: (IsLocationUpdatedBy loc Word8, ListLike state Word8) => P (Str Word8 state loc) Word8

或者沿着这些行定义您自己的类型同义词。