在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/