使用 attoparsec 在 Haskell 中重载字符串的问题

Issue with overloading strings in Haskell using attoparsec

首先,我想告诉您我是 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

这是我的错误信息:

我已使用 "OverloadedStrings" 尝试解决此问题,但似乎没有用。此外,任何有关开始使用 attoparsec 的示例或教程的指导都会非常有帮助!

-XOverloadedStrings 仅将 string literals 的类型从 String 更改为更通用的 IsString a => a (可以与 StringTextByteString 等等)。在您的代码中,只有一个文字:文件名 "small.txt".

但是文件名总是 String 好吧,FilePath,但这只是 String 的同义词。 (即使 Data.Text.IO 函数也将文件名当作普通的旧列表字符串。)所以重载的字符串文字实际上在这里根本没有区别。

但是解析器不处理文件名而是处理文件内容,所以你需要做的是使用获取此内容的IO例程作为Text.

import qualified Data.Text.IO as Txt

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