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