
I appreciate your comment. I agree that the type of findM should be the one you suggested, and it still fits my original purpose. It's no more than a step arout.
\begin{code}
import IO findM f [] = return Nothing findM f (x:xs) = do { b <- f x; if b then return (Just x) else findM f xs }
isLeft (Left _) = True isLeft _ = False
main = findM (>>=return.isLeft) (hCat stdin) where hCat h = try (hGetLine h>>=putStrLn) : hCat h
\end{code}
Yes, you are right. It was enough because, you don't really care about what you found, you just want to search and stop when you do find something. You are returning the action that returned an element that satisfied your condition, not the actual element like before.
I expetct the next Haskell Library Report includes findM. It's obviously useful.
I think both versions can be very useful: findM :: (Monad m) => (a -> m Bool) -> [a] -> m (Maybe a) findM' :: (Monad m) => (a -> Bool) -> [m a] -> m (Maybe a) Same can be said for, takeWhileM :: (Monad m) => (a -> m Bool) -> [a] -> m [a] takeWhileM' :: (Monad m) => (a -> Bool) -> [m a] -> m [a] both would be usefull for different purposes. Oh and since we're on it I also miss, iterateM :: (Monad m) => (a -> m a) -> a -> m [a] untilM :: (Monad m) => (a -> m a) -> a -> m [a] etc etc... I've just been coding them as I need them, like many of you I suppose. J.A.