Ответ 1
Но это, очевидно, неправильно.
Нет, это абсолютно правильно.
Тип (++)
-
(++) :: [a] -> [a] -> [a]
и тип целочисленных литералов
1 :: Num n => n
Итак, тип [a]
, который должен иметь аргумент (++)
, унифицирован с типом Num n => n
, который имеет литерал, давая
1 ++ 2 :: Num [a] => [a]
и если у вас есть тип списка с экземпляром Num
, это выражение также может быть оценено.
Но по умолчанию для типов списков нет экземпляра Num
, поэтому, когда вы пытаетесь его оценить, ghci жалуется, что не находит экземпляр Num
для [a]
.
Например:
Prelude> instance Num a => Num [a] where fromInteger n = Data.List.genericReplicate n 1
<interactive>:2:10: Warning:
No explicit method or default declaration for `+'
In the instance declaration for `Num [a]'
<interactive>:2:10: Warning:
No explicit method or default declaration for `*'
In the instance declaration for `Num [a]'
<interactive>:2:10: Warning:
No explicit method or default declaration for `abs'
In the instance declaration for `Num [a]'
<interactive>:2:10: Warning:
No explicit method or default declaration for `signum'
In the instance declaration for `Num [a]'
Prelude> 1 ++ 2 :: [Int]
[1,1,1]