首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用attoparsec处理Haskell中的重载字符串

使用attoparsec处理Haskell中的重载字符串
EN

Stack Overflow用户
提问于 2018-05-03 22:49:48
回答 1查看 100关注 0票数 0

首先,我想让大家知道,我对Haskell相当陌生,我正在努力了解haskell解析器是如何工作的。因此,我基本上是试图解析这个电子书从http://www.gutenberg.org/files/57071/57071-0.txt和分析文本。喜欢输出英语单词、句子和段落等的数量。这是我的密码:

代码语言:javascript
复制
{-# 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.Internalt.ext’匹配; 预期类型: Data.Text.Internal.Text; 实际类型:字符串
  • 在“解析”的第二个参数中,即“($)”的第二个参数中的“输入”,即“do”块中的stmt中的“解析散文输入”:打印$解析散文输入。

我用过"OverloadedStrings“来尝试解决这个问题,但它似乎不起作用。另外,任何关于使用attoparsec的示例或教程的指导都是非常有用的!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-03 23:06:40

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

但是无论如何,文件名总是String!好吧,FilePath,但那只是String的同义词。(甚至Data.Text.IO函数也将文件名作为普通的旧列表字符串。)因此,重载的字符串文本实际上在这里没有任何区别。

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

代码语言:javascript
复制
import qualified Data.Text.IO as Txt

main :: IO()
main = do
  input <- Txt.readFile "small.txt"
  print $ parse prose input
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50164814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档