我是haskell的初学者,正在阅读Learn you a haskell book。一段时间以来,我一直在尝试消化仿函数和应用仿函数。
在应用仿函数主题中,Maybe
的实例实现给出为
instance Applicative Maybe where
pure = Just
Nothing <*> _ = Nothing
(Just f) <*> something = fmap f something
所以,据我了解,我们得到
Nothing
如果左侧仿函数(对于 <*>
)为空。对我来说,这似乎更有意义 Nothing <*> something = something
所以这个应用仿函数没有效果。有什么用例,如果有的话,用于分发
Nothing
?说,我有一个
Maybe String
和我一起,我不知道谁的值(value)。我必须给这个Maybe
到第三方功能,但希望其结果经过几个Maybe (a -> b)
的第一个。如果其中一些函数是Nothing
我希望他们默默地返回他们的输入,而不是给出 Nothing
,即数据丢失。那么,返回
Nothing
背后的想法是什么?在上述情况下?
最佳答案
那将如何运作?这是类型签名:
(<*>) :: Applicative f => f (a -> b) -> f a -> f b
所以这里的第二个参数是
Maybe a
类型。 ,而结果需要是 Maybe b
类型.你需要一些方法来打开a
进入 b
,只有当第一个参数不是 Nothing
时才能这样做.如果你有一个或多个类型的值
Maybe (a -> a)
并且想要应用任何不是 Nothing
.但这对于 (<*>)
的一般定义来说太具体了。 .编辑:因为它似乎是
Maybe (a -> a)
你真正关心的场景,这里有几个例子说明你可以用一堆这种类型的值做什么:保留所有功能并丢弃
Nothing
s,然后应用它们:applyJust :: [Maybe (a -> a)] -> a -> a
applyJust = foldr (.) id . catMaybes
catMaybes
函数为您提供一个仅包含 Just
的列表值,然后是 foldr
将它们组合在一起,从标识函数开始(如果没有要应用的函数,您将获得该函数)。或者,您可以使用函数,直到找到
Nothing
,然后纾困:applyWhileJust :: [Maybe (a -> a)] -> a -> a
applyWhileJust (Just f:fs) = f . applyWhileJust fs
applyWhileJust (Nothing:_) = id
这使用了与上面类似的想法,只是当它找到
Nothing
它忽略了列表的其余部分。喜欢的话也可以写成applyWhileJust = foldr (maybe (const id) (.)) id
但这有点难以阅读......
关于haskell - 为什么<*>中的函数为Nothing时Maybe的Applicative实例不给出任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8628080/