parserChar :: Char -> Parser Char
parserChar c = Parser ch where
ch d = case dvChar d of
Parsed c dp -> Parsed c dp
_ -> NoParse
Вышеупомянутая функция должна принимать Char c
и возвращать Parser, который будет соответствовать только c
. Функция dvChar d
вернет либо Parsed char dp
, либо NoParse
(где char
— следующий символ в строке). Таким образом, я надеялся, что Parsed c dp
будет соответствовать только результату, в котором char==c
, но на самом деле происходит то, что синтаксический анализатор, возвращаемый этой функцией, соответствует любому символу (даже несмотря на то, что c
кажется привязанным к какому-то конкретному символу Char). , как аргумент функции).
Следующая функция работает корректно:
parserChar :: Char -> Parser Char
parserChar c = Parser ch where
ch d = case dvChar d of
Parsed char dp -> if char == c then Parsed char dp else NoParse
_ -> NoParse
Ручное кодирование синтаксического анализатора для разбора буквы 'a'
также работает корректно, в этом
case dvChar d of
Parsed 'a' dp -> Parsed 'a' dp
_ -> NoParse
вернет успех только в том случае, если символ был 'a'
.
Так что дает? Можете ли вы сопоставлять литералы только по такому шаблону (например, несмотря на то, что Char находится в классе Eq, if char==c (..)
все равно нужно кодировать вручную), или я делаю что-то не так?