Написанная вами функция говорит: «Дайте мне что-нибудь, и я верну это вам». Тип, который вы написали, говорит: «Я могу преобразовать Int
в любой тип, который пожелает вызывающий, если этот тип является экземпляром класса типов IntClass
».
Когда мы соединим их вместе, у нас будет функция, которая будет принимать Int
от вызывающей стороны и возвращать ее обратно. За исключением того, что когда будет возвращено то же самое Int
, это будет значение любого типа, который хотел бы вызывающий, если этот тип является членом класса типов IntClass
. Как вход может перейти от Int
к любому (ограниченному) типу, который хотел бы вызывающий? Это невозможно. Поскольку входные данные возвращаются прямо назад, тип возвращаемого значения должен быть таким же, как и тип аргумента. Средство проверки типов делает вывод об этом из вашего кода, но затем не может согласовать этот вывод с тем, что вы называете тип вывода r
. Средство проверки типов хочет работать с вами над этим, но не может быть уверено, что r
— это то же самое, что и Int
, учитывая единственную гипотезу, что r
является экземпляром класса типов IntClass
.
Функция, похожая на ту, которую вы написали, называется fromInteger
и находится в классе типов Num
. Если вы хотите поговорить обо всех типах, которые вы можете создать на основе Int
, то это должен быть метод вашего класса типов. Что-то типа:
class IntClass a where
intToIntClass :: Int -> a
Вы должны определить этот метод для каждого типа, который вы хотите сделать экземпляром IntClass
, и получить желаемый тип intToIntClass :: IntClass r => Int -> r
. Этот полиморфизм возвращаемого типа критически зависит от каждого участвующего типа, имеющего соответствующее определение intToIntClass
.
person
Anthony
schedule
29.04.2012
(r ~ Int)
верхней строки в сообщении об ошибке означает, что не удалось вывести тип r того же типа, что и Int.~
(тильда) означает равенство типов, к которому, как только вы привыкнете, это нормально, но если вы видите это впервые, то это немного странно. Использование более естественного=
для равенства типов сделало бы синтаксис Haskell неоднозначным, когда он используется в программах, а не в сообщениях об ошибках. - person stephen tetley   schedule 30.04.2012