alternates :: IterV el [el] alternates = fmap catMaybes . sequence . replicate 5 $ drop1keep1 -- replicate 5 $drop1keep1 :: [IterV el (Maybe el)] -- sequence . replicate 5 $ drop1keep1 :: IterV el [ Maybe el ] Let's say this as X -- fmap catMaybes X :: IterV el (([Maybe a] -> [a]) [ Maybe el ]) -- fmap catMaybes X :: IterV el [ el ]
Suppose we have a type "V X Y Z", this should be understood as "(V X Y) Z". If V X Y is monad, the type has value Z.
z <- vxyz :: V X Y Z z
The type of z is Z. And return always wrap a value with appropriate "context" (Monadic type) like:
somefunc :: V X Y Z somefunc = do return z
Here, without specifying V X Y, "return" generates Monadic value of type "V X Y Z"