comb3 :: (a -> b -> c -> d) -> [a] -> [b] -> [c] -> [d] comb3 f xs ys zs = do x <- xs y <- ys z <- zs return $ f x y z -- alternative version with (>>=) doing same thing: comb3a f xs ys zs = xs >>= \x -> ys >>= \y -> zs >>= \z -> return $ f x y z triple :: a -> b -> c -> (a, b, c) triple x y z = (x, y, z) main = do let xs = [1..3] let ys = ['a'..'c'] let zs = [True, False] print $ comb3 triple xs ys zs print $ comb3a triple xs ys zs