Ограничение Integral
происходит из показателя степени 2
. Помните, что в Haskell целочисленные литералы на самом деле являются полиморфными значениями типа Num a => a
. Затем компилятор делает вывод, что, поскольку он используется в качестве показателя степени для (^) :: (Num a, Integral b) => a -> b -> a
, он должен иметь более ограниченный тип Integral a => a
.
Чтобы избавить вас от необходимости устранять неоднозначность числовых литералов по всему коду, Haskell использует тип по умолчанию , чтобы выбрать приемлемый конкретный тип для любых неограниченных числовых типов. В этом случае это будет Integer
. Разница, по-видимому, заключается в том, что :type
в Hugs сообщает о предполагаемом типе до того, как это произойдет, в то время как GHCi сообщает о типе после применения значения по умолчанию.
Если вы укажете конкретный тип для показателя степени самостоятельно, дополнительное ограничение исчезнет.
Hugs> :type (\x -> x^(2 :: Integer))
\x -> x ^ 2 :: Num a => a -> a