|
| |||
|
|
Что-то похожее есть в Haskell. Но там хитрее (и, по моему, лучше): Там "классы типов", то есть некий интерфейс, которым обладает тип. Ну классика: class Eq a where (==): a -> a -> Bool И, скажем, реализация; instance Eq a => Eq [a] where a == b = ... То есть тут instance задает правило для реализации сравнения списков, если есть сравнение элементов. Кайф в возможности писать вещи вроде: count: Eq a => a - > [a] -> Int count e [] = 0 count e (a:b) | a == e = 1 + count e b count e (a:b) | otherwise = count e b Реализация простая - "предикат" (Eq a => ...) в типе значения (функции) означает, что у функции есть неявный параметр - табличка с "интерфейсом". А всякие instance задают правила, позволюще ее получить. С одной стороны - тут интерфес полностью отвязан от типа (это что-то вроде "точки зрения на тип"), с другой - все хорошо. Наследованию соотвестует описание класса, у которого "пререквизитом" является набор других классов. В приципе - сейчас это навернули до нескольких параметров, так что можно описывать довольно сложные отношения между типами. Система мне очень нравится, правда в Haskell как всегда навернули ее сверх меры. Добавить комментарий: |
||||