Uh guys? [1]> (remove-if-not #'evenp `(1 2 3 4 5 6 7 8 9 10) :count 3 :start 1) (1 2 4 6 8 9 10) As pointed out by owl57, the Haskell translation is incorrect and the correct implementation isn't quite so trivial. I don't see a way to pull the :count argument out into a separate function. We certainly can for skip, though, and I might. Prelude> skipThen 1 (removeIfNot even 3) [2,3,4,5,6,7,8,9] [2,4,6,8,9] as implemen…
import Data.Bifunctor (bimap, first)
type Split a = ([a], [a])
unsplit :: Split a -> [a]
unsplit = uncurry (++)
splitStart :: [a] -> Split a
splitStart xs = ([], xs)
skip :: Int -> Split a -> Split a
skip n (xs, ys) = first (xs ++) (splitAt n ys)
iterateN :: Int -> (a -> a) -> a -> a
iterateN n f = (!! n) . iterate f
removeOneIfNot :: (a -> Bool) -> Split a -> Split a
removeOneIfNot p (xs, ys) = bimap (xs ++) (drop 1) (span p ys)
GHCI> unsplit . iterateN 3 (removeOneIfNot even) . skip 5 . splitStart $ [1..15]
[1,2,3,4,5,6,8,10,12,13,14,15]