LINUX.ORG.RU

История изменений

Исправление 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]]

Так понятно?