> Simple Cat (revisitied)
>
> \begin{code}
>
> import IO
>
> findM f [] = return Nothing
> findM f (x:xs) = do { v <- x; if f v then return (Just v) else findM f xs }
>
> isLeft (Left _) = True
> isLeft _ = False
>
> main = findM (isLeft) (hCat stdin) where hCat h = try (hGetLine h) : hCat h
>
> \end{code}
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.
_______________________________________________
Haskell-Cafe mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell-cafe