Использование uu-parsinglib для разбора последовательности Word8

Я пытаюсь использовать uu-parsinglib для работы на [Word8] а не [Чар]. (Я хочу использовать 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 ответ

Решение

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). Так как парсер

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

Входными данными для Parser является ListLike of Char, и, следовательно, pSatisfy может возвращать только Parser Char. Таким образом, типы запрещают то, что вы пытаетесь сделать.

Может быть, вы должны напечатать свою функцию как-то вроде

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

Или определите свой собственный синоним типа по этим направлениям.

Другие вопросы по тегам