【发布时间】:2014-03-24 23:35:11
【问题描述】:
Attoparsec 提供了函数takeWhile1 至少消耗一个字符。
但是,skipWhile 没有模拟。 skipWhile1这个功能怎么实现?
注意:这个问题故意显示没有研究工作,因为它是问答式回答的。
【问题讨论】:
标签: haskell attoparsec
Attoparsec 提供了函数takeWhile1 至少消耗一个字符。
但是,skipWhile 没有模拟。 skipWhile1这个功能怎么实现?
注意:这个问题故意显示没有研究工作,因为它是问答式回答的。
【问题讨论】:
标签: haskell attoparsec
另一种可能的实现方式:
import Control.Applicative
skipWhile1 p = skip p *> skipWhile p
这实际上可能比@Uli 的答案更快,因为takeWhile 构建了一个结果字符串,而skipWhile 没有。懒惰可能会使它们等效(即,如果您不使用它,takeWhile 可能实际上不会构建字符串);我目前无法测试来验证这一点。
【讨论】:
您可以将Control.Monad.void 与takeWhile1 一起使用来简单地忽略结果:
import Data.Attoparsec.Char8
import Control.Monad (void)
skipWhile1 :: (Char -> Bool) -> Parser ()
skipWhile1 = void . takeWhile1
【讨论】: