首先,我想让你知道我对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
(可以与String
、Text
、ByteString
等统一(。在您的代码中,只有一个文字:文件名"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