2015-07-21 2 views
0

Я пытаюсь использовать uu-parsinglib для работы с [Word8], а не с [Char]. (Я хочу использовать uu-parsinglib для сообщения об ошибках.) Мне нужен синтаксический анализатор, который доставит мне следующий Word8 в последовательности, что бы это ни было. Как только у меня есть это, я могу построить более сложные парсеры. Но мне трудно понять, как его написать. Ближайший я был в состоянии получить это:Использование uu-parsinglib для разбора последовательности Word8s

{-# 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 

Таким образом, синтаксический анализатор возвращает тот же тип, что и вход (a). Так как синтаксический анализатор

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

На вход Parser является ListLike полукокса, и, следовательно, pSatisfy может возвращать только Parser Char. Поэтому типы запрещают то, что вы пытаетесь сделать.

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

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

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

+0

Спасибо, эти типы теперь имеют больше смысла! – mhwombat