Ответ 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