История изменений
Исправление qnikst, (текущая версия) :
нет, я это у видел у Фуда на поинте, и там же и написал.
тип цифры в ghc это (Num a => a), т.е. любой тип a имеющий констрейнт Num a, а конкретно функцию fromInteger. Поэтому везде где ты видишь цифру ты можешь представить, что там стоит fromInteger цифра.
Соответвенно функция принимает вид [fromIngeger 1,[fromInteger 2,fromInteger 3],fromInteger 4]
,
очевидно, что её тип это [[t]], но т.к. мы вызываем fromInteger на t, то появляется констрейни Num t, отсюда же констрейн [t]. Если попытаться вычислить данную функцию, то подходящий инстанс не будет найден, но все можно исправить:
Prelude> instance Num t => Num [t] where fromInteger t = [fromInteger t]
<interactive>:4:10: Warning:
No explicit implementation for
‘+’, ‘*’, ‘abs’, ‘signum’, and (either ‘negate’ or ‘-’)
In the instance declaration for ‘Num [t]’
Prelude> [1,[2,3]]
[[1],[2,3]]
Так понятно?
P.S. на #haskell наверняка получше написали, но мне лень открывать ноут, на котором я там залогинен, чтобы смотреть логи.
Исходная версия qnikst, :
нет, я это у видел у Фуда на поинте, и там же и написал.
тип цифры в ghc это (Num a => a), т.е. любой тип a имеющий констрейнт Num a, а конкретно функцию fromInteger. Поэтому везде где ты видишь цифру ты можешь представить, что там стоит fromInteger цифра.
Соответвенно функция принимает вид [fromIngeger 1,[fromInteger 2,fromInteger 3],fromInteger 4]
,
очевидно, что её тип это [[t]], но т.к. мы вызываем fromInteger на t, то появляется констрейни Num t, отсюда же констрейн [t]. Если попытаться вычислить данную функцию, то подходящий инстанс не будет найден, но все можно исправить:
Prelude> instance Num t => Num [t] where fromInteger t = [fromInteger t]
<interactive>:4:10: Warning:
No explicit implementation for
‘+’, ‘*’, ‘abs’, ‘signum’, and (either ‘negate’ or ‘-’)
In the instance declaration for ‘Num [t]’
Prelude> [1,[2,3]]
[[1],[2,3]]
Так понятно?