По умолчанию ghci
работает в IO
монаде.Поэтому, когда вы пытаетесь оценить a
, переменная типа m
становится IO
.И a
переменная имеет тип Num a => IO a
.Когда вы оцениваете действие IO
внутри repl, ghci
просто выполняет его и печатает результат.В вашем случае это Num a => a
(и по умолчанию для полиморфных переменных с ограничением Num
в ghci
это Integer
тип данных).
Но IO
тип данных не имеет Show
пример.Там нет такого экземпляра, и он даже не может существовать!Прежде чем вычислять какое-либо выражение в ghci
, оно должно удовлетворять всем ограничениям.Поскольку он не может удовлетворить Show (IO a)
(поскольку такого экземпляра нет), он не может заменить IO
на переменную типа m
.Но тогда: какой m
вы точно хотите?ghci
не могу угадать для вас.Поведение отличается для разных m
с.
ghci> b = return 5 :: (Monad m, Num a, Show (m a)) => m a
ghci> b :: Maybe Int
Just 5
ghci> b :: [Int]
[5]