Урок Хаскелл Тип
Я читаю статью о зависимо-типизированном программировании и наткнулся на следующую цитату:
"[...] в отличие от классов типов Haskell, тип данных [...] is закрытые", в том смысле, что нельзя добавлять новые типы для вселенной без расширения типа данных.
мой вопрос новичка: в каком смысле классы типа Haskell открыть? Как они раздвижные? Кроме того, каковы теоретико-типовые последствия этого свойство (открыть vs закрыть)?
спасибо!
4 ответов
учитывая класс типа, как:
class Monoid m where
mempty :: m
mappend :: m -> m -> m
... он (в основном) реализован под капотом как тип словаря:
data Monoid m = Monoid
{ mempty :: m
, mappend :: m -> m -> m
}
экземпляры, такие как:
instance Monoid [a] where
mempty = []
mappend = (++)
... получить перевод в словари:
listIsAMonoid :: Monoid [a]
listIsAMonoid = Monoid
{ mempty = []
, mappend = (++)
}
... и компилятор консультируется выше словаря всякий раз, когда вы используете списки в их качестве Monoid
s.
это подводит нас к вашим вопросам:
в каком смысле открыты классы типа Haskell? Как они раздвижные?
они открыты в том же смысле, что и полиморфные значения. У нас есть полиморфный тип данных:
data Monoid m = ...
... и мы можем создать экземпляр полиморфного m
введите переменную для любого типа, где мы можем предоставить подходящие значения для mempty
и mappend
поля.
классы типов открыты, потому что вы можете сделать его экземпляром произвольного типа. При создании класса type вы указываете интерфейс, но не типы, которые ему принадлежат. Затем в любом коде, который включает определение типа, вы можете сделать свой экземпляр типа, предоставляя необходимые функции из интерфейса, используя instance TypeClass type of
синтаксис.
классы типов "открыты", потому что они всегда могут иметь больше типов, добавленных к ним" после факта", добавив больше объявлений экземпляра. Это можно сделать даже в" клиентском " коде, который просто использует модуль, содержащий класс type.
ключевым моментом является то, что я могу написать код, который работает со значениями с некоторым ограничением типа-класса, и тот же код без изменений может использоваться для типов, которые не существовали, когда я писал тип класс.
конкретные типы данных в Haskell "закрыты" в том, что это не может произойти. Если я пишу код, который работает с членами определенного типа данных (даже если он полиморфен), то вы не можете использовать этот код для работы с новыми видами вещей, о которых я не думал, если вы не можете изменить тип (что, вероятно, требует изменения всех мест, где он используется).
у Ральфа Леммеля есть очень хорошие видео лекции по Channel9 об этом - очень рекомендую.