- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想,只是为了了解一些关于 Iteratees 的知识,使用 Data.Iteratee 和 Data.Attoparsec.Iteratee 重新实现我制作的一个简单的解析器。不过,我很难过。下面我有一个简单的例子,它能够解析文件中的一行。我的解析器一次读取一行,所以我需要一种向迭代器提供行的方法,直到它完成。我已经阅读了我在谷歌上搜索到的所有内容,但是很多关于 iteratee/enumerators 的 Material 都非常先进。这是重要的代码部分:
-- There are more imports above.
import Data.Attoparsec.Iteratee
import Data.Iteratee (joinI, run)
import Data.Iteratee.IO (defaultBufSize, enumFile)
line :: Parser ByteString -- left the implementation out (it doesn't check for
new line)
iter = parserToIteratee line
main = do
p <- liftM head getArgs
i <- enumFile defaultBufSize p $ iter
i' <- run i
print i'
enumLines
在Iteratee中,但我一生都无法弄清楚如何使用它。也许我误解了它的目的?
最佳答案
由于您的解析器一次只运行一行,因此您甚至不需要使用 attoparsec-iteratee。我会这样写:
import Data.Iteratee as I
import Data.Iteratee.Char
import Data.Attoparsec as A
parser :: Parser ParseOutput
type POut = Either String ParseOutput
processLines :: Iteratee ByteString IO [POut]
processLines = joinI $ (enumLinesBS ><> I.mapStream (A.parseOnly parser)) stream2list
enumLinesBS
和
mapStream
是被枚举者。
mapStream
足够了:
i1 :: Iteratee [ByteString] IO (Iteratee [POut] IO [POut]
i1 = mapStream (A.parseOnly parser) stream2list
[ByteString]
的流到
[POut]
的流,并且当运行最终迭代(stream2list)时,它将该流返回为
[POut]
.所以现在你只需要
lines
的 iteratee 等价物创建
[ByteString]
的流,这就是
enumLinesBS
做:
i2 :: Iteratee ByteString IO (Iteratee [ByteString] IO (Iteratee [POut] m [POut])))
i2 = enumLinesBS $ mapStream f stream2list
joinI
,
(><>)
, 和
(><>)
:
e1 :: Iteratee [POut] IO a -> Iteratee ByteString IO (Iteratee [POut] IO a)
e1 = enumLinesBS ><> mapStream (A.parseOnly parser)
i' :: Iteratee ByteString IO [POut]
i' = joinI $ e1 stream2list
e1
内联。
Data.Iteratee.ListLike.mapM_
通常对创建消费者有用。此时流的每个元素都是一个解析结果,所以如果你想打印它们,你可以使用
consumeParse :: Iteratee [POut] IO ()
consumeParse = I.mapM_ (either (\e -> return ()) print)
processLines2 :: Iteratee ByteString IO ()
processLines2 = joinI $ (enumLinesBS ><> I.mapStream (A.parseOnly parser)) consumeParse
关于haskell - Attoparsec Iteratee,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6360963/
关闭。这个问题需要更多 focused .它目前不接受答案。 想改进这个问题?更新问题,使其仅关注一个问题 editing this post . 3年前关闭。 Improve this questi
我想,只是为了了解一些关于 Iteratees 的知识,使用 Data.Iteratee 和 Data.Attoparsec.Iteratee 重新实现我制作的一个简单的解析器。不过,我很难过。下面我
我被 attoparsec 困住了,我无法返回关于它是“嵌入式类型”的值。 我试图解析一个文件: type value type value ... 例如: 0 -- code for a strin
我正在使用 Attoparsec,并且我想在整个解析任务中跟踪用户状态值。 我熟悉 Parsec 的一元函数 getState、putState 和修改状态,但我似乎无法在 Attoparsec 中找
我正在尝试在第 5 列中使用 JSON 制作适合导入到 mongoDB 的大型 TSV 文件。特别是我想将顶级和仅顶级关键字段更改为 _id。这是我目前所拥有的,它似乎有效但速度很慢: {-# LAN
假设有一个数据结构表示一个文本,里面有评论。 data TWC = T Text TWC -- text | C Text TWC -- comment | E -- end deri
我正在使用据说默认回溯的 Attoparsec。但是,以下行: parseOnly (string "foo" *> many1 anyChar manyTill1 p e = (:) p m
我正在尝试用一个函数来扩充 Haskell 的 Attoparsec 解析器库 takeRegex :: Regex -> Parser ByteString 使用其中一种正则表达式实现。 (动机:好
是否有一些“简单”的方法(例如我在 Attoparsec 或其他一些库中缺少的东西)将定义的 Attoparsec 解析器从 ByteString 解析为从 Text 解析的解析器? 例如我有: im
Attoparsec提供了至少消耗一个字符的函数 takeWhile1。 但是,skipWhile 没有类似的东西。如何实现这个函数skipWhile1? 注意:这个问题故意表现出没有研究工作,因为它
我正在将一些使用 Parsec 的功能 Haskell 代码转换为使用 Attoparsec,希望获得更好的性能。我已经进行了更改并且所有内容都已编译,但我的解析器无法正常工作。 我正在解析一个由各种
我的类型: data Test = Test { a :: Int, b :: Int } deriving (Show) 我的解析器: testParser :: Parser Test tes
背景 我使用 attoparsec 编写了一个日志文件解析器。我所有较小的解析器都成功了,组成的最终解析器也是如此。我已通过 tests 确认了这一点。但我在使用解析的流执行操作时遇到了困难。 我尝试
我一直在编写 attoparsec 解析器,并且一直在寻找一种模式,我想将解析器转换为递归解析器(将它们与 monad 绑定(bind) >>= 运算符递归地组合)。 所以我创建了一个函数将解析器转换
我一直在编写一个 attoparsec 解析器来解析 Uniform Code for Units of Measure 的内容。调用 。它被定义为某个类(该类包括所有数字 0-9)中不以数字结尾的最
Attoparsec提供了至少消耗一个字符的函数 takeWhile1。 但是,skipWhile 没有类似的东西。如何实现这个函数skipWhile1? 注意:这个问题故意表现出没有研究工作,因为它
我正在使用 attoparsec 的内置解析器“double”和“number”来解析浮点值,我从不同的解析器得到不同的结果。 >parse number "8.918605790440055e-2"
attoparsec 0.72 有这个功能,但在后来的版本中似乎消失了: stringTransform :: (ByteString -> ByteString) -> ByteString ->
我有一个简单的基于 attoparsec 的 pdf parser .它工作正常,直到与 iteratee 一起使用。 当输入的大小超过缓冲区大小时。 import qualified Data.By
我使用 attoparsec 编写了以下解析代码: data Test = Test { a :: Int, b :: Int } deriving (Show) testParser :
我是一名优秀的程序员,十分优秀!