2016-08-31 6 views
2

Я следую https://en.wikibooks.org/wiki/Haskell/Understanding_monads/State и randomIO печатает целое число в ghci напрямую. Учитывая, что его тип является полиморфным, как ghci знает, что это Int здесь? Существуют ли специальные правила для вывода типа в ghci?ghci randomio type вывод

GHCi> :m System.Random 
GHCi> :t randomIO 
randomIO :: Random a => IO a 
GHCi> randomIO 
-1557093684 
GHCi> randomIO 
1342278538 

ответ

0

Я полагаю, что это просто просто 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 
+3

Технически, если нет объявления функции, это не ограничение мономорфизма, а только основные правила дефолта. Ограничение мономорфизма - это то, как правила дефолта применимы к определениям функций. – Guvante

+0

Я быстро посмотрел на ссылку; «Ограничение включено по умолчанию в скомпилированных модулях и отключено по умолчанию в приглашении GHCi (начиная с GHC 7.8.1)». Кажется, что он выключен в ghci. (Я использовал ghci 7.10.3.) –

+0

@AlbertNetymk да, как сказано выше, правила ограничения и дефолта - это разные вещи. Поэтому ограничение отключено, но правила по умолчанию все еще применяются. См. Эту ссылку: https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/ghci.html#type-defaulting-in-ghci – Shersh