首先,我想让大家知道,我对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的示例或教程的指导都是非常有用的!
发布于 2018-05-03 23:06:40
-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 inputhttps://stackoverflow.com/questions/50164814
复制相似问题