Почему в Haskell не так много дискуссий о co - и contra-дисперсии (в отличие от Scala или C#)?



Я знаю, что ковариантность и контравариантность типов. Мой вопрос в том, почему я еще не сталкивался с обсуждением этих концепций в моем исследовании Haskell (в отличие, скажем, от Scala)?



кажется, есть фундаментальная разница в том, как Haskell рассматривает типы В отличие от Scala или C#, и я хотел бы сформулировать, в чем эта разница.



или, может быть, я ошибаюсь, и я просто еще не узнал достаточно Haskell: -)

598   3  

3 ответов:

есть две основные причины:

  • Haskell не имеет врожденного понятия подтипа, поэтому в целом дисперсия менее актуальна.
  • контравариантность в основном появляется там, где участвует изменчивость, поэтому большинство типов данных в Haskell будет просто ковариантным, и будет мало смысла явно различать это.

тем не менее, концепции применяются--например, операция подъема, выполняемая fmap на Functor экземпляров фактически ковариантный; термины ко - / контравариантность используются в теории категорий, чтобы говорить о функторах. Элемент contravariant пакета определяет класс типа для контравариантных функторов, и если вы посмотрите на список экземпляров, вы увидите, почему я сказал, что это гораздо менее распространено.

есть также места, где идея проявляется неявно, в том, как работают ручные преобразования-различные классы числовых типов определяют преобразования в и из основных типов, таких как Integer и Rational, и модуль Data.List содержит общие версии некоторых стандартных функций. Если вы посмотрите на типы этих общих версий вы увидите, что Integral ограничения (дает toInteger) используются на типах в контравариантном положении, в то время как Num ограничения (дает fromInteger) используются для ковариантного положения.

в Haskell нет "подтипов", поэтому ковариация и контравариация не имеют никакого смысла.

в Scala, у вас есть, например,Option[+A] С подклассами Some[+A] и None. Вы должны предоставить ковариационные аннотации + чтобы сказать, что Option[Foo] это Option[Bar] если Foo extends Bar. Из-за наличия подтипов, это необходимо.

в Haskell нет подтипов. Эквивалент Option в Haskell, называется Maybe, это определение:

data Maybe a = Nothing | Just a

переменная типа a может быть только один тип, поэтому никакой дополнительной информации об этом необходимо.

Как уже упоминалось, Haskell не имеет подтипов. Однако, если вы смотрите на typeclasses, может быть неясно, как это работает без подтипа.

Typeclasses определяют предикаты для типов, а не сами типы. Поэтому, когда класс типа имеет суперкласс (например, Eq A => Ord a), это не означает, что экземпляры являются подтипами, потому что наследуются только предикаты, а не сами типы.

кроме того, co -, contra-и In-variance означают разные вещи в разных областях математики (см. Википедию). Например, термины ковариант и контравариант используются в функторах (которые, в свою очередь, используются в Haskell), но термины означают что-то совершенно другое. Термин инвариант может быть использован во многих местах.

Comments

    Ничего не найдено.