Проблема с перегрузкой строк в Haskell с использованием attoparsec - PullRequest
0 голосов
/ 04 мая 2018

Прежде всего я хотел бы сообщить вам, что я довольно новичок в Haskell и пытаюсь понять, как парсеры работают в haskell. Поэтому я в основном пытаюсь разобрать эту электронную книгу с http://www.gutenberg.org/files/57071/57071-0.txt и проанализировать текст. Как вывести количество английских слов, предложений и параграфов и тому подобное. Вот мой код:

{-# LANGUAGE OverloadedStrings #-}

import Control.Exception (catch, SomeException)
import System.Environment (getArgs)
import Data.Attoparsec.Text
import Data.Char
import Control.Applicative ((<*>), (*>), (<$>), (<|>), pure)


data Prose = Prose {
  word :: String
} deriving Show

prose :: Parser Prose
prose = do
  word <- many' $ satisfy isAlphaNum
  return $ Prose word

main :: IO()
main = do
  input <- readFile "small.txt"
  print $ parse prose input

Это мое сообщение об ошибке:

  • Не удалось сопоставить тип Char [Char] с ‘Data.Text.Internal.Text’;
    Ожидаемый тип: Data.Text.Internal.Text;
    Фактический тип: String
  • Во втором аргументе «parse», а именно «input» Во втором аргументе «($)», а именно «разбирать ввод текста» В блоке 'do' блока: выведите $ parse prose input

Я использовал «OverloadedStrings», чтобы попытаться исправить эту проблему, но, похоже, она не работает. Кроме того, любое руководство по примерам или учебникам по началу работы с attoparsec будет очень полезным!

1 Ответ

0 голосов
/ 04 мая 2018

-XOverloadedStrings изменяет только тип строковых литералов с String на более общий IsString a => a (который может быть объединен с String, Text, ByteString и более) , В вашем коде есть только один литерал: имя файла "small.txt".

Но имена файлов всегда String в любом случае! Ну, FilePath, но это просто синоним для String. (Даже функции Data.Text.IO принимают имена файлов в виде строк простого старого списка.) Таким образом, перегруженный строковый литерал здесь фактически не имеет значения.

Но анализатор обрабатывает не имена файлов, а файл содержимое , поэтому вам нужно использовать процедуры ввода-вывода, которые получают этот контент как Text.

import qualified Data.Text.IO as Txt

main :: IO()
main = do
  input <- Txt.readFile "small.txt"
  print $ parse prose input
...