Здравствуйте, BulatZiganshin, Вы писали:
BZ>полиморфные коллекции — это соджержащие объекты разных типов, реализующих общий интерфейс. пусть скажем, это фигуры, которые можно рисовать на экране — треугольники, овалы и т.д. если каждый объект включает свою собственную VMT, то из неё вы узнаёте, как нарисовать это конкретный объект. если же вы перелаёте одну VMT на всё-про всё, то нифига хорошего не выйдет реализация этого требует так называемых existentials, которые включают VMT класса вместе с каждым объектом:
BZ>BZ>diplayAll1 :: Figure a => [a] -> IO ()
BZ>diplayAll2 :: [exist a . Figure a => a] -> IO ()
BZ>
Разве в GHC есть exist? Я думал он через forall делается. Если есть — где почитать?
Насчёт forall — тут уже не будет так однозначно, т.к. тип
[forall a. Figure a => a]
описать можно, но использовать его элементы не получится. Пправда, не знаю почему — читал где-то, что функции не могут быть экзистенциальными, только типы. Т.е.
data Shape = forall a. Figure a => Shape a
displayAll :: [Shape] -> IO ()
displayAll = mapM_ display
уже сработает.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>