foo :: Int -> (forall a. a -> (a -> String) -> r) -> r foo n k | even n = k (show n) id | otherwise = k n show bar :: Int -> String bar n = foo n $ \x1 f1 -> foo (n+1) $ \x2 f2 -> f1 x1 ++ f2 x2 main :: IO () main = putStrLn (bar 42)