乍一看,我认为这两个功能将发挥相同的作用:

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

08-07 03:52