Я полагаю, что это просто просто Monomorphism restriction. Полиморфные типы, такие как Num a => a
, обрабатываются как Integer
, если фактический тип не указан. Вероятно, это правило также работает в ghci
, и вы видите целочисленный тип вместо некоторой неизвестной переменной типа.
UPD 1: Фактический ответ содержится в этой части руководства пользователя о defaulting rules.
UPD 2: Корпус с классомоказался сложнее, чем я ожидал. Поэтому в этом случае правила дефолта разрешаются из-за объявления default (Integer, Double)
, которое указано в отчете. Рассмотрите следующую сессию ghci
Prelude System.Random> default()
Prelude System.Random> randomIO
<interactive>:6:1:
No instance for (Show (IO a0)) arising from a use of ‘print’
In a stmt of an interactive GHCi command: print it
Prelude System.Random> default (Integer)
Prelude System.Random> randomIO
-7948113563809442883
Prelude System.Random> default (Double)
Prelude System.Random> randomIO
0.41581766590151104
Технически, если нет объявления функции, это не ограничение мономорфизма, а только основные правила дефолта. Ограничение мономорфизма - это то, как правила дефолта применимы к определениям функций. – Guvante
Я быстро посмотрел на ссылку; «Ограничение включено по умолчанию в скомпилированных модулях и отключено по умолчанию в приглашении GHCi (начиная с GHC 7.8.1)». Кажется, что он выключен в ghci. (Я использовал ghci 7.10.3.) –
@AlbertNetymk да, как сказано выше, правила ограничения и дефолта - это разные вещи. Поэтому ограничение отключено, но правила по умолчанию все еще применяются. См. Эту ссылку: https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/ghci.html#type-defaulting-in-ghci – Shersh