Почему "вернуть ничего" ничего не возвращает?

"return a" предполагается обернуть в контексте некоторой 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)

Но если я его оцениваю, я не вижу внешнюю Монаду, только внутреннюю. Может быть:

*Main>  return Nothing
Nothing

Ответ 1

Когда GHCi отправляется на печать значения, он пробует две разные вещи. Во-первых, он пытается унифицировать тип с IO a для некоторого a. Если он может это сделать, он выполняет операцию ввода-вывода и пытается распечатать результат. Если он не может этого сделать, он пытается напечатать заданное значение. В вашем случае 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