Два pure Nothing
в вашем коде используют разные pure
.
Если вы исследуете тип pure Nothing
, вы увидите, что выбранная версия pure
зависит от введите f
.
GHCi> :t pure Nothing
pure Nothing :: Applicative f => f (Maybe a)
Когда вы вводите pure Nothing
в интерактивном режиме, f
выводится как IO
, и выводится результат операции IO
. Это ярлык, предоставляемый GHCi, которого нет в обычном коде Haskell.
GHCi> pure Nothing
Nothing
GHCi> pure Nothing :: IO (Maybe ())
Nothing
Однако при сравнении pure Nothing
с Nothing
, f
выводится как Maybe
. Это создает два слоя Maybe
, что делает тип Maybe (Maybe a)
GHCi> Nothing == pure Nothing
False
GHCi> Just Nothing == pure Nothing
True
GHCi> pure Nothing :: Maybe (Maybe ())
Just Nothing