haskell - 为什么<*>中的函数为Nothing时Maybe的Applicative实例不给出任何内容

标签 haskell functor applicative

我是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/

相关文章:

C++:传递具有任意数量参数的函数作为参数

haskell - 是否有像 `dbg` 这样的跟踪调试器可用于 Haskell 或 OCaml?

c++ - 为 STL 排序算法定义 < - 运算符重载、仿函数或独立函数?

haskell - Hasql:编码和类型

sml - 标准 ML : making a type transparent with opaque signature ascription

haskell - 这种特殊的仿函数结构叫什么?

haskell - Monad 是替代品但不是 MonadPlus 的例子是什么?

haskell - 为什么我不能将其从 Monad 推广到 Applicative?

haskell - 如何在 Haskell 中对类型类进行分组

Haskell - 将元组添加到元组列表(如果尚不存在),否则会增加元组的现有值