我正在尝试使用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
?
答案 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
或者沿着这些行定义您自己的类型同义词。