Здравствуйте, <Аноним>, Вы писали:
А>Коллеги,
А>никак не могу разобраться с классами типов в Haskell. Объясните, или подскажите, что почитать.
А в чём именно затык?
Классы типов нужны для перегрузки функций. Это основное.
Что почитать — находится в гугле
Во-первых, откуда они взялись:
How to Make Ad-Hoc Polymorphism Less Ad Hoc
Ну и глава из туториала и вики
http://en.wikibooks.org/wiki/Haskell/Class_Declarations
http://en.wikibooks.org/wiki/Haskell/Classes_and_types
http://en.wikibooks.org/wiki/Haskell/Advanced_type_classes
http://www.haskell.org/tutorial/classes.html
А>Если опыт программирования на Java, C#. Понимаю классы, интерфейсы, дженерики с констрейнтами.
Может быть это для сравнения?
http://www.haskell.org/haskellwiki/OOP_vs_type_classes
Но лучше вопросы задавай.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Здравствуйте, Аноним, Вы писали:
А>Коллеги,
А>никак не могу разобраться с классами типов в Haskell. Объясните, или подскажите, что почитать.
А>Если опыт программирования на Java, C#. Понимаю классы, интерфейсы, дженерики с констрейнтами.
Чтобы проще понять, то, наверное, ближе всего они к интерфейсам. Но мощнее
class SomeClass where ... — это объявление "интерфейса".
instance SomeClass MyType where ... — реализация "интерфейса" для указанного типа.
Естественно, это в самых общих чертах. Отличий много. Реализация — вне самого типа, т.е. можно объявить принадлежащим к классу типов любой, хоть свой, хоть чужой, тип.
Constraints позволяют указать, при каких условиях тип будет принадлежать к классу типов. Возможна перегрузка по возвращаемому значению функции.
Кстати, с Java/C# бэкграундом бывает тяжеловато понять просто в силу непривычности нотации (где тип, где type constructor, где data constructor, а где вообще вызов функции). Может, имеет смысл сначала еще раз перечитать про типы.
-- есть стандартный класс Show:
-- типы, принадлежащие к классу Show, можно преобразовывать в строку
class Show s where
show :: s -> String
-- т.е. функция show может быть применена только к типу, принадлежащему к классу Show
data MyComplexType a = MyComplexType Int a
-- следующая конструкция означает:
-- при условии, что MyComplexType параметризован типом s, принадлежащим к классу типов Show,
-- MyComplexType s также принадлежит к классу типов Show
instance Show s => Show (MyComplexType s) where
show (MyComplexType ident val) = "MyComplexType identified by " ++ show ident ++ " containing " ++ val
сорри.. в последней строчке наврал...
instance Show s => Show (MyComplexType s) where
show (MyComplexType ident val) = "MyComplexType identified by " ++ show ident ++ " containing " ++ show val
Здравствуйте, Аноним, Вы писали:
А>Коллеги,
А>никак не могу разобраться с классами типов в Haskell. Объясните, или подскажите, что почитать.
А>Если опыт программирования на Java, C#. Понимаю классы, интерфейсы, дженерики с констрейнтами.
В Хаскелле — это классы типов, а не сами типы, как это является в Яве/С++ и т.п.
Для меня все прояснил вот
этот туториал по Haskell ну и
где-то тут на форуме была растусовка чем отличаются виды полиморфизмаАвтор: Gaperton
Дата: 26.02.08
, просто в Хаскелле немного другой... т.е. т.н. Ad hoс... надеюсь, поможет...