# Why no findM ? simple Cat revisited

**Ahn Ki-yung
**
kyagrd@bawi.org

*Wed, 20 Nov 2002 23:33:46 +0900*

Jorge Adriano wrote:
>*Seems to me like the name findM could be misleading
*>*mapM :: (Monad m) => (a -> m b) -> [a] -> m [b]
*>*filterM :: (Monad m) => (a -> m Bool) -> [a] -> m [a]
*>*
*>*These take a monadic function and a list of elements. Yours works the other
*>*way around (takes a function and a list of 'monadic elements').
*>*I'd expect the definition of findM to be:
*>*
*>*findM' :: (Monad m) => (a -> m Bool) -> [a] -> m (Maybe a)
*>*findM' f [] = return Nothing
*>*findM' f (x:xs) = do { b <- f x; if b then return (Just x) else findM' f xs }
*>*
*>*This one doesn't serve your purpose though.
*>*J.A.
*>*
*>*
*
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}
I expetct the next Haskell Library Report includes findM.
It's obviously useful.