使用 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
这是我的错误信息:
- 无法将类型“[Char]”与“Data.Text.Internal.Text”匹配;
预期类型:Data.Text.Internal.Text;
实际类型:String
- ‘parse’的第二个参数,即‘input’
在‘($)’的第二个参数中,即‘parse prose input’
在 'do' 块的 stmt 中: print $ parse prose input
我已使用 "OverloadedStrings" 尝试解决此问题,但似乎没有用。此外,任何有关开始使用 attoparsec 的示例或教程的指导都会非常有帮助!
-XOverloadedStrings
仅将 string literals 的类型从 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
首先,我想告诉您我是 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]”与“Data.Text.Internal.Text”匹配;
预期类型:Data.Text.Internal.Text;
实际类型:String - ‘parse’的第二个参数,即‘input’ 在‘($)’的第二个参数中,即‘parse prose input’ 在 'do' 块的 stmt 中: print $ parse prose input
我已使用 "OverloadedStrings" 尝试解决此问题,但似乎没有用。此外,任何有关开始使用 attoparsec 的示例或教程的指导都会非常有帮助!
-XOverloadedStrings
仅将 string literals 的类型从 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