История изменений
Исправление 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
В общем-то мы упускаем из виду, что все доказательства как раз таки построены на выводе типов, но это ведь такие мелочи?