Something like the code below - populate a list with partially applied functions, then use foldl to apply the functions in turn to the input list?
v :: Int -> [a] -> [a]
v = drop
w :: Int -> Int -> [a] -> [a]
w keep reject = (take keep).(drop reject)
-- Apply the list of functions (in turn) to the list, yielding a list
apply_ops :: [ [a] -> [a] ] -> [a] -> [a]
apply_ops fns l = foldl (flip ($)) l fns
-- Partially apply functions with non-list arguments to get list of functions of type [a] -> [a]
ops :: [ [a] -> [a] ]
ops = [v 3, w 2 1]
-- result = (w 2 1) ((v 3)[1,2,3,4,5,6,7,8])
-- = w [4,5,6,7,8]
-- = [5,6]
result :: [Int]
result = apply_ops ops [1,2,3,4,5,6,7,8]
main =
do
print result