为什么 "return Nothing" return 什么都没有?
Why does "return Nothing" return Nothing?
"return a" 应该在某些 Monad 的上下文中包装 a:
*Main> :i return
class Applicative m => Monad (m :: * -> *) where
...
return :: a -> m a
...
-- Defined in ‘GHC.Base’
如果我问 GHCI "return Nothing" 的类型是什么,它符合:
*Main> :t return Nothing
return Nothing :: Monad m => m (Maybe a)
但是如果我评估它,我看不到外部 Monad,只有内部 Maybe:
*Main> return Nothing
Nothing
当 GHCi 打印一个值时,它会尝试两种不同的方法。首先,它尝试将某些 a
的类型与 IO a
统一。如果它能做到,那么它会执行 IO 操作并尝试打印结果。如果它不能这样做,它会尝试打印给定的值。在您的情况下,Monad m => m (Maybe a)
可以与 IO (Maybe a)
统一。
查看此 GHCi session 可能会有所帮助:
Prelude> return Nothing
Nothing
Prelude> return Nothing :: IO (Maybe a)
Nothing
Prelude> return Nothing :: Maybe (Maybe a)
Just Nothing
Prelude> Nothing
Nothing
"return a" 应该在某些 Monad 的上下文中包装 a:
*Main> :i return
class Applicative m => Monad (m :: * -> *) where
...
return :: a -> m a
...
-- Defined in ‘GHC.Base’
如果我问 GHCI "return Nothing" 的类型是什么,它符合:
*Main> :t return Nothing
return Nothing :: Monad m => m (Maybe a)
但是如果我评估它,我看不到外部 Monad,只有内部 Maybe:
*Main> return Nothing
Nothing
当 GHCi 打印一个值时,它会尝试两种不同的方法。首先,它尝试将某些 a
的类型与 IO a
统一。如果它能做到,那么它会执行 IO 操作并尝试打印结果。如果它不能这样做,它会尝试打印给定的值。在您的情况下,Monad m => m (Maybe a)
可以与 IO (Maybe a)
统一。
查看此 GHCi session 可能会有所帮助:
Prelude> return Nothing
Nothing
Prelude> return Nothing :: IO (Maybe a)
Nothing
Prelude> return Nothing :: Maybe (Maybe a)
Just Nothing
Prelude> Nothing
Nothing