【发布时间】:2016-01-22 15:25:28
【问题描述】:
乍一看,我认为这两个函数的工作方式是一样的:
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)
但他们没有。特别是,一旦第一个 p x 为真,firstM 就会停止。但是firstM',因为mapM,需要评估整个列表。
是否存在启用第二个定义的“惰性mapM”,或者至少一个不需要显式递归的定义?
【问题讨论】:
-
你的意思是
fmap listToMaybe (filterM p xs)? -
你在哪个 monad 中运行你的两个函数? (特别是,我怀疑部分答案是“没有适用于所有moands的'lazy mapM'的定义”,部分答案是“IO的lazy mapM基本上以Haskell的方式混合动作和惰性评估是旨在避免”)。
-
firstM和firstM'具有不同的类型 和 语义。第一个是Monad m => (a -> m Bool) -> [a] -> m (Maybe a),而后者是Monad m => (a -> m b) -> [a] -> m (Maybe b)。你确定吗?
标签: haskell monads lazy-evaluation