如何使用Haskell和海龟库从文件流式传输时删除行

mig*_*rao 3 haskell haskell-turtle

假设我想从一个文件流到另一个文件,但我想跳过输入文件的前n行.如果没有先使用'fold'折叠整个第一个文件,我该怎么做?

import Turtle
main = output "/tmp/b.txt" (f (input "/tmp/a.txt"))
Run Code Online (Sandbox Code Playgroud)

应该做什么才能实现这一目标?

ps:我没有足够的声誉来创建'haskell-turtle'标签.

Gab*_*lez 5

我认为这是正确的代码:

import Data.IORef
import Turtle

drop :: Int -> Shell a -> Shell a
drop n s = Shell (\(FoldM step begin done) -> do
    ref <- newIORef 0
    let step' x a = do
            n' <- readIORef ref
            writeIORef ref (n' + 1)
            if n' < n then return x else step x a
    foldIO s (FoldM step' begin done) )
Run Code Online (Sandbox Code Playgroud)

...除了我可能称之为别的东西,drop以避免与前奏曲发生冲突.

它几乎完全相同Turtle.Prelude.limit(参见源代码进行比较).唯一的区别是我已经撤销了声明的thenelse条款if.

如果这解决了你的问题,那么我会把它添加到Turtle.Prelude.

  • 您是否认为值得将`import Data.IORef`添加到代码段?我知道Turtle部分针对初学者,所以我认为它可能是值得的. (2认同)