乍一看,我认为这两个功能将发挥相同的作用:
firstM _ [] = return Nothing
firstM p (x:xs) = p x >>= \r -> if r then return (Just x) else firstM p xs
firstM' p xs = fmap listToMaybe (mapM p xs)
但是他们没有。特别是,第一个
firstM
为真时,p x
就会停止。但是由于firstM'
,mapM
需要评估整个列表。是否有启用第二个定义的“惰性
mapM
”,或者至少有一个不需要显式递归的定义? 最佳答案
没有(不可能)安全的Monad
-多态惰性mapM
。但是the monad-loops
package包含许多具有各种纯函数的惰性单子变体,并包含firstM
。