3

假设我想从一个文件流式传输到另一个文件,但我想跳过输入文件的前 n 行。如何在不首先使用 'fold' 折叠整个第一个文件的情况下做到这一点?

import Turtle
main = output "/tmp/b.txt" (f (input "/tmp/a.txt"))

'f' 应该在这里完成什么?

ps:我没有足够的声誉来创建“haskell-turtle”标签。

4

1 回答 1

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) )

drop...除了避免与前奏冲突之外,我可能会称它为其他东西。

它几乎与Turtle.Prelude.limit(参见源代码进行比较)相同。唯一的区别是我颠倒了语句的thenandelse子句if

如果这解决了您的问题,那么我会将其添加到Turtle.Prelude.

于 2015-02-10T00:42:19.023 回答