Я учусь использовать классы типов в Haskell.
Рассмотрим следующую реализацию класса типов T с функцией класса с ограничениями типа f.
class T t where
f :: (Eq u) => t -> u
data T_Impl = T_Impl_Bool Bool | T_Impl_Int Int | T_Impl_Float Float
instance T T_Impl where
f (T_Impl_Bool x) = x
f (T_Impl_Int x) = x
f (T_Impl_Float x) = x
Когда я загружаю это в GHCI 7.10.2, я получаю следующую ошибку:
Couldn't match expected type ‘u’ with actual type ‘Float’ ‘u’ is a rigid type variable bound by the type signature for f :: Eq u => T_Impl -> u at generics.hs:6:5 Relevant bindings include f :: T_Impl -> u (bound at generics.hs:6:5) In the expression: x In an equation for ‘f’: f (T_Impl_Float x) = x
Что я делаю / понимаю неправильно? Мне кажется разумным, что кто-то захочет специализировать класс типов в экземпляре, предоставив сопутствующий конструктор данных и реализацию функции. Часть
Не удалось сопоставить ожидаемый тип "
u" с фактическим типом "Float"
особенно сбивает с толку. Почему u не соответствует Float, если u имеет только ограничение, которое должно квалифицироваться как Eq тип (Floats делают это afaik)?
Eqтип вы хотите от меня в результате - я могу предоставить его - person Random Dev   schedule 02.06.2016f :: Eq u => t -> u-tизвестно из контекста - тамuс неявнымforall- person Random Dev   schedule 02.06.2016u- это действительно то, что Чи указал в своем ответе и комментариях - person Random Dev   schedule 02.06.2016