source code of GHC.Base中,Applicative Maybe定义为:

instance Applicative Maybe where
    pure = Just
    ...

我想知道为什么纯净的定义忽略Nothing

根据这个定义,我期望
pure Nothing应该减少为Just Nothing,因为pure = Just
Prelude> Just Nothing
Just Nothing

而不是:
Prelude> pure Nothing
Nothing

为什么这是魔术?我怎么了谢谢!

最佳答案

它不会忽略Nothing,但是您需要指定运行Applicative函数的pure,如果我们使用-XTypeApplications运行它,我们可以指定Applicative的类型,然后获得:

$ ghci -XTypeApplications
GHCi, version 8.0.2: http://www.haskell.org/ghc/  :? for help
Prelude> pure @Maybe Nothing
Just Nothing

如果未指定类型,则解释器将“默认”为某个Applicative(在本例中为IO)变体,因此这意味着它将返回该值,并且解释器的标准行为是打印该值“包装”在IO shell中。
Applicative采用pure = Just的原因是因为它必须与Functor实例一致。此仿函数实例定义为:



现在需要满足的法律之一是:



因此,如果我们定义pure _ = Nothing,则意味着fmap f x = Nothing <*> x,这意味着我们“丢失了有关f的信息”。结果,唯一合理的解决方案可能是fmap始终返回Nothing,但这作为函子没有多大意义。此外,它将在函子级别违反另一个约束,即fmap id x应该始终返回x

关于haskell - 为什么将 `pure`的 `Applicative Maybe`定义为 `pure = Just`而忽略 `Nothing`?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53021094/

10-11 23:18