Ваша factorial
функция полиморфна: она имеет тип (Eq p, Num p) => p -> p
. Когда вы просто называете это как factorial 60
, p
создается как Integer
(этот выбор называется «тип по умолчанию»), что имеет произвольную точность и не имеет верхней границы. Однако length
не является полиморфным в своем выводе: он всегда возвращает Int
. Haskell не будет автоматически конвертировать числовые типы для вас, поэтому, когда вы вызываете factorial
с результатом length
, он также использует Int
, который имеет верхнюю границу, которая в вашем случае выглядит как 9223372036854775807
(что вы можете проверить, выполнив maxBound :: Int
). Чтобы обойти эту проблему, вы можете либо самостоятельно преобразовать Int
в Integer
:
subsets k list = factorial (toInteger n) where
n = length list
, либо использовать genericLength
, что совпадает с length
, за исключением того, что он полиморфен в своем выводевведите:
import Data.List
subsets k list = factorial n where
n = genericLength list
Обратите внимание, что если вы используете последний вариант, вы должны быть осторожны, чтобы не делать ничего другого, что заставило бы использовать Int
вместо значения по умолчанию Integer
.