当<*>中的函数为Nothing时,为什么Maybe的Nant的Applicative实例无效

Shr*_*rat 14 haskell functor applicative

我是haskell的初学者,正在阅读"了解你是一本哈克尔书".我一直试图消化仿函数和应用函子一段时间.

在应用性函子的话题,为实例执行Maybe给定为

instance Applicative Maybe where
  pure = Just
  Nothing <*> _ = Nothing
  (Just f) <*> something = fmap f something
Run Code Online (Sandbox Code Playgroud)

所以,据我所知,Nothing如果左侧仿函数(for <*>)为Nothing ,我们得到.对我来说,似乎更有意义

  Nothing <*> something = something
Run Code Online (Sandbox Code Playgroud)

所以这个applicative functor没有效果.什么是用例,如果有的话给出Nothing

说,我Maybe String和我在一起,我不知道它的价值.我必须将它赋予Maybe第三方功能,但希望其结果先经过几次Maybe (a -> b).如果其中一些函数是Nothing我希望它们默默地返回它们的输入,而不是给出一个Nothing,这就是数据丢失.

那么,Nothing在上面的例子中回归的想法是什么?

C. *_*ann 15

那会怎么样?这是类型签名:

(<*>) :: Applicative f => f (a -> b) -> f a -> f b
Run Code Online (Sandbox Code Playgroud)

所以这里的第二个参数是类型Maybe a,而结果需要是类型Maybe b.你需要一些方法来a转变b,你只有在第一个参数不是时才能这样做Nothing.

这样的事情唯一可行的方法是,如果你有一个或多个类型的值,Maybe (a -> a)并想要应用任何不是Nothing.但这对于一般定义来说太具体了(<*>).


编辑:因为它似乎是Maybe (a -> a)你真正关心的场景,所以这里有一些关于你可以用这种类型的值做些什么的例子:

保留所有功能并丢弃Nothings,然后应用它们:

applyJust :: [Maybe (a -> a)] -> a -> a
applyJust = foldr (.) id . catMaybes
Run Code Online (Sandbox Code Playgroud)

catMaybes函数为您提供了一个仅包含Just值的列表,然后将foldr它们组合在一起,从身份函数开始(如果没有要应用的函数,这将是您将获得的).

或者,您可以采取功能,直到找到Nothing,然后拯救:

applyWhileJust :: [Maybe (a -> a)] -> a -> a
applyWhileJust (Just f:fs) = f . applyWhileJust fs
applyWhileJust (Nothing:_) = id
Run Code Online (Sandbox Code Playgroud)

这使用了与上面类似的想法,除了当它发现Nothing忽略列表的其余部分时.如果你愿意,你也可以写它,applyWhileJust = foldr (maybe (const id) (.)) id但这有点难以阅读......

  • 可能不够用.为什么不把`Maybe(a - > a)`值放在一个列表中,然后编写一个找到非'Nothing`函数的函数并组成它们?例如`applyJust :: [Maybe(a - > a)] - > a - > a`. (2认同)

dfl*_*str 8

将其<*>视为普通*运营商.a * 0 == 0, 对?什么a是无关紧要的.所以使用相同的逻辑,Just (const a) <*> Nothing == Nothing.该Applicative法律规定,一个数据类型有这样的表现.

这有用的原因是,Maybe它应该代表某种东西的存在,而不是缺少某种东西.如果Maybe通过一系列函数传递值,如果一个函数失败,则表示发生了故障,并且需要中止该过程.

你提出的行为是不切实际的,因为它有很多问题:

  1. 如果失败的函数要返回其输入,则它必须具有类型a -> a,因为返回的值和输入值必须具有相同的类型,以便它们可以互换,具体取决于函数的结果
  2. 根据你的逻辑,如果你有Just (const 2) <*> Just 5什么?如何使这种情况下的行为与案件保持一致Nothing

又见Applicative法律.

编辑:修复代码拼写错误,并再次