LINUX.ORG.RU

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

Исправление qnikst, (текущая версия) :

Еще раз для особо одаренных - проблема состоит в том, что вместо указания места ошибки хотя бы с точностью до функции, она указывается с точностью «где-то среди всех твоих исходников, ищи сам».

Для особо одаренных, тайпчеккер тебе точно сказал где ошибка типизации в твоём коде. А писал бы код без warning-ов (top level entity missing type signature это warning) так и вообще бы эту проблему никогда не увидел - высосано из пальца в общем.

онечно, теоретики код не пишут, и ошибки им искать/исправлять не приходится - по-этому для них это не проблема.

да, но одно но, теоретиком тут являешься ты и monk, а я пишу код. Соотв, если я тут начну задвигать теории про лиспы, то мне можно будет говорить, что я теоретик, но поскольку у меня нету опыта работы на лиспе, то говорить про него я не буду.

Здесь проблема в том, что в хаскеле нету Any, а полимофрный аргумент в подстановке - общий.

да, в haskell нету subtyping, а проблема - ли это вопрос другой, для лисперов, наверное проблема.

теперь твой пример в случае haskell:

Prelude> let f x = x
Prelude> :t f
f :: t -> t
Prelude| let f x = (x+1)
Prelude> :t f
f :: Num a => a -> a

по-этому если мы попытаемся с ним что-то сделать (например сложить с чем-нибудь) то получим эррор,

Prelude> :{
Prelude| let f :: a -> a
Prelude|     f x = x+1
Prelude| :}

<interactive>:14:12:
    No instance for (Num a) arising from a use of ‘+’
    Possible fix:
      add (Num a) to the context of the type signature for f :: a -> a
    In the expression: x + 1
    In an equation for ‘f’: f x = x + 1

получили ошибку, чтобы «что-угодно» можно было сложить необходимо, чтобы это «что-угодно» умело доказать, что оно умеет складываться.

Prelude> (1::Double) + f 0
2.0
Prelude> :t it
it :: Double

В общем-то мы упускаем из виду, что все доказательства как раз таки построены на выводе типов, но это ведь такие мелочи?

Исходная версия qnikst, :

Еще раз для особо одаренных - проблема состоит в том, что вместо указания места ошибки хотя бы с точностью до функции, она указывается с точностью «где-то среди всех твоих исходников, ищи сам».

Для особо одаренных, тайпчеккер тебе точно сказал где ошибка типизации в твоём коде. А писал бы код без warning-ов (top level entity missing type signature это warning) так и вообще бы эту проблему никогда не увидел - высосано из пальца в общем.

онечно, теоретики код не пишут, и ошибки им искать/исправлять не приходится - по-этому для них это не проблема.

да, но одно но, теоретиком тут являешься ты и monk, а я пишу код.

Здесь проблема в том, что в хаскеле нету Any, а полимофрный аргумент в подстановке - общий.

да, в haskell нету subtyping, а проблема - ли это вопрос другой, для лисперов, наверное проблема.

теперь твой пример в случае haskell:

Prelude> let f x = x
Prelude> :t f
f :: t -> t
Prelude| let f x = (x+1)
Prelude> :t f
f :: Num a => a -> a

по-этому если мы попытаемся с ним что-то сделать (например сложить с чем-нибудь) то получим эррор,

Prelude> :{
Prelude| let f :: a -> a
Prelude|     f x = x+1
Prelude| :}

<interactive>:14:12:
    No instance for (Num a) arising from a use of ‘+’
    Possible fix:
      add (Num a) to the context of the type signature for f :: a -> a
    In the expression: x + 1
    In an equation for ‘f’: f x = x + 1

получили ошибку, чтобы «что-угодно» можно было сложить необходимо, чтобы это «что-угодно» умело доказать, что оно умеет складываться.

Prelude> (1::Double) + f 0
2.0
Prelude> :t it
it :: Double

В общем-то мы упускаем из виду, что все доказательства как раз таки построены на выводе типов, но это ведь такие мелочи?