Разобрать строку, используя Parsec? - PullRequest
0 голосов
/ 18 октября 2018

Я пытаюсь проанализировать строку с использованием parsec в Haskell, однако каждая попытка выдает другой тип ошибки.

import Text.ParserCombinators.Parsec
csvFile = endBy line eol
line = sepBy cell (char ',')
cell = many (noneOf ",\n")
eol = char '\n'

parseCSV :: String -> Either ParseError [[String]]
parseCSV input = parse csvFile "(unknown)" input

Этот код при запуске через стек ghci выдает ошибку, говорящую «аргумент без переменной типа в ограничении: Text.Parsec.Prim.Stream»

По существу, мне интересноКакой самый простой способ разбить строку в токены, основанные на запятых, находится в Haskell.Это кажется очень простой концепцией, и я предполагал, что это будет большой опыт обучения, но до сих пор он не вызывал ничего, кроме ошибок.

1 Ответ

0 голосов
/ 18 октября 2018

Я вижу ошибку при вводе char '\n' в ghci:

<interactive>:4:1: error:
• Non type-variable argument
    in the constraint: Text.Parsec.Prim.Stream s m Char
  (Use FlexibleContexts to permit this)
• When checking the inferred type
    it :: forall s (m :: * -> *) u.
          Text.Parsec.Prim.Stream s m Char =>
          Text.Parsec.Prim.ParsecT s u m Char

Совет по поводу FlexibleContexts точен.Вы можете включить FlexibleContexts следующим образом:

*Main> :set -XFlexibleContexts

К сожалению, следующая ошибка - • No instance for (Show (Text.Parsec.Prim.ParsecT s0 u0 m0 Char)) (в основном, мы не можем напечатать функцию), поэтому вам все равно придется применить анализатор кнекоторые входные данные для его запуска.

Как и комментаторы, я считаю, что parseCSV может использоваться без каких-либо языковых расширений.

Здесь происходит несколько вещей:

  • В контексте всей программы тип eol ограничен сигнатурой типа parseCSV.Этого не происходит при наборе eol = char '\n' в GHCi.

  • GHCi's :t является разрешающим - он готов напечатать некоторые типы, которые используют языковые функции, которые не включены.

  • GHC выросла за счет добавления большого количества языковых расширений , которые программист может включить для каждого модуля.Некоторые из них широко используются готовыми библиотеками, другие - новыми и экспериментальными.

...