Объятия `/` против вывода типа - PullRequest
4 голосов
/ 26 марта 2012

В GHCi следующий код работает нормально:

f1 :: Float
f1 = f2

-- f2 :: Float
f2 = 1/1

Но в Hugs я получаю ошибку типа - она ​​хочет быть Double. Когда я раскомментирую сигнатуру типа f2, она работает нормально.

Разве не следует позаботиться о выводе типа?

Это ошибка в Hugs?

Я проверил тип /, а экземпляры Double и Float - / работают на Fractional с, и есть дробный экземпляр для Double и Float, так что это не должно быть проблемой.

1 Ответ

7 голосов
/ 26 марта 2012

При связывании без сигнатуры типа f2 имеет полиморфный логический тип (Fractional a => a), который должен быть мономорфизирован из-за ограничения мономорфизма (если это не отключено).В отсутствие других объявлений по умолчанию переменная типа с ограничением Fractional по умолчанию имеет значение Double.Кажется, что Hugs сначала делает дефолт, а затем подавляет попытку связать объявленное Float f1 со значением Double f2.GHC смотрит дальше и видит, что f2 используется в типе Float, и, следовательно, мономорфизируется f2 до Float.

Я не уверен, какое поведение предписывает языковой стандарт в этой ситуации, ноЯ думаю, что GHC верны, потому что мономорфизация должна происходить только после ввода группы связывания, и я думаю, что f1 и f2 вместе образуют группу связывания, потому что f1 использует f2.

...