filterM して head ってのはこれ? これは要素があっても[IO a]が無限リストなら停止しないよ
findM' :: Monad m => (c -> m Bool) -> [m c] -> m c findM' f = head <=< filterM (join . liftM f)
一方、こっちは要素があれば止まる(無ければ止まらない)
findM :: Monad m => (a -> m Bool) -> [m a] -> m (Maybe a) findM f [] = return Nothing findM f (x:xs) = do v <- x t <- f v if t then return $ Just v else findM f xs
テストしてみれば分かる
ms :: [IO Int] ms = map return [1..]
main = do --print =<< findM' (return . (> 10)) ms print =<< findM (return . (> 10)) ms