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



首先,我想让你知道我对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

这是我的错误消息:

  • 无法将类型"[字符]"与"数据文本内部文本"匹配;
    预期类型:数据文本内部文本;
    实际类型:字符串
  • 在"parse"的第二个参数中,即"输入" 在"($("的第二个参数中,即"解析散文输入" 在"do"块的 stmt 中:打印 $ 解析散文输入

我使用"重载字符串"来尝试解决此问题,但它似乎不起作用。此外,任何关于开始使用attoparsec的示例或教程的指导都将非常有帮助!

-XOverloadedStrings只是将字符串文字的类型从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

相关内容

  • 没有找到相关文章

最新更新