为什么"什么都不返回"什么都没回来?

时间:2017-08-08 03:41:38

标签: haskell monads maybe

"返回"应该在一些Monad的背景下包装:

*Main> :i return
class Applicative m => Monad (m :: * -> *) where
  ...
  return :: a -> m a
  ...
        -- Defined in ‘GHC.Base’

如果我问GHCI什么类型的"什么都不返回"是的,它符合:

*Main> :t return Nothing
return Nothing :: Monad m => m (Maybe a)

但是如果我评估它,我看不到外在的Monad,只有内在的可能:

*Main>  return Nothing
Nothing

1 个答案:

答案 0 :(得分:21)

当GHCi去打印一个值时,它会尝试两种不同的东西。首先,它尝试将IO a的类型与某些a统一起来。如果它可以这样做,那么它执行IO操作并尝试打印结果。如果它不能这样做,它会尝试打印给定的值。在您的情况下,Monad m => m (Maybe a)可与IO (Maybe a)统一。

审核此GHCi会话可能有所帮助:

Prelude> return Nothing
Nothing
Prelude> return Nothing :: IO (Maybe a)
Nothing
Prelude> return Nothing :: Maybe (Maybe a)
Just Nothing
Prelude> Nothing
Nothing