haskell - 如何使用管道将双选项卡替换为单选项卡?

标签 haskell haskell-pipes

我需要用单个选项卡替换字节字符串中的所有连续选项卡,如下所示:

"___\t___\t\t___\t\t\t___"

变成了

"___\t___\t___\t___"

知道该怎么做。

经过半个小时的弄清楚,我成功地替换了第一次出现的双制表符,如下所示(即使这实际上是错误的 - 它向空字符串添加了一个制表符):

import qualified Pipes.ByteString as PB
import qualified Data.ByteString as B

removeConsecutiveTabs =
  PB.break (== tab) . mapped %~ \p -> do
    yield (B.singleton tab)
    PB.dropWhile (== tab) p

但是,我仍然不知道如何替换所有出现的连续选项卡。

最佳答案

试试这个:

{-# LANGUAGE OverloadedStrings #-}

import Pipes
import qualified Pipes.Prelude as P
import qualified Pipes.ByteString as PB
import           Data.ByteString (ByteString)
import Control.Lens hiding (each)

cleanTabs p = do
  p1 <- view (PB.span (/= 9)) p
  x <- lift $ next p1
  case x of
    Left r -> return r
    Right (a, p2) -> do
      yield "\t"
      let p3 = PB.dropWhile (== 9) (yield a >> p2)
      cleanTabs p3

source :: Monad m => Producer ByteString m ()
source = each [ "this", "is\t an", "\t\texample\t", "\t.", "\t\tmiddle\t", "\there"]

example = do
  putStrLn $ "input: " ++ (show $ P.toList source)
  putStrLn $ "output:" ++ (show $ P.toList (cleanTabs source))

关于haskell - 如何使用管道将双选项卡替换为单选项卡?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32157114/

相关文章:

haskell - 组合两个单子(monad)变压器堆栈时无法派生 Applicative

haskell - 管道 : open a file according to content of another

haskell - 如何使用 Conduit 保存文件?

haskell - 跳过管道 attoparsec 中的第一行

Haskell Pipes - 获取管道中最后一个代理的返回值

haskell - 映射然后在 Haskell 中过滤

haskell - 如何更改 runTCPClient 超时持续时间?

graphics - 简单的 Haskell 图形库?

list - Haskell 函数 (a -> [b]) -> [a -> b]

haskell - 管道教程 : ListT example