Ограничение мономорфизма, ghci и выражение let

#haskell

#хаскелл

Вопрос:

Это выражение неверно.

 f = show
  

Однако в ghci это законно

 let f = show
  

Более того, его тип изменен на

 () -> String
  

Есть ли какое-либо объяснение этому явлению?

Ответ №1:

Приглашение ghci ведет себя так, как если ExtendedDefaultRules бы расширение было включено.

В частности, это означает, что:

Тип unit () добавляется в начало стандартного списка типов, которые проверяются при выполнении типа по умолчанию.

Итак, чтобы получить такое же поведение из исходного файла, либо скомпилируйте с -XExtendedDefaultRules помощью, либо добавьте {-# LANGUAGE ExtendedDefaultRules #-} в начало файла.