GHCi различное поведение для значения с / без ограничения Show - PullRequest
0 голосов
/ 07 июня 2018

Я пытался понять, что GHCi делает для печати значений, я думал, что он просто сделает что-то вроде вызова putStrLn . show для значения, но потом это произошло:

a = return 5 :: (Monad m, Num a) => m a
a -- prints 5

b = return 5 :: (Monad m, Num a, Show (m a)) => m a
b -- Ambiguous type variable `m0`...

Почему это добавлениеограничение шоу изменить это поведение?Я думал, что это будет предполагаться при попытке напечатать значение.

1 Ответ

0 голосов
/ 07 июня 2018

По умолчанию ghci работает в IO монаде.Поэтому, когда вы пытаетесь оценить a, переменная типа m становится IOa переменная имеет тип 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]
...