Что такое "полиморфизм а-ля-карт" и как я могу извлечь из этого пользу?

В своем выступлении " Simple Made Easy" Рик Хикки рассказывает о "полиморфизме а-ля-карт" (около 30:00 в видео). В этом же контексте он также упоминает классы типов Хаскелла и мультиметоды Clojure (и протоколы).

Поскольку я не очень знаком с этими концепциями, я хотел бы понять их полезность, пытаясь достичь простоты. Я особенно заинтересован в любых примерах или витринах этой концепции в Scala.

1 ответ

Вы можете принять Полиморфизм а ля карт как Полиморфизм по требованию.

Сообщество Clojure гордится термином Полиморфизм а-ля-карт, потому что Clojure поддерживает несколько стратегий полиморфизма. Некоторые из них:

  • Прототип на основе полиморфизма

  • Наследственный полиморфизм

    Это стратегия полиморфизма, используемая Java. Clojure поддерживает это по доверенности. Полезно при взаимодействии с Java.

  • протокол

    Протокол к Clojure - это как TypeClass для Haskell.

  • Многометодная

    В то время как протоколы обеспечивают полиморфную диспетчеризацию, основанную на типе первого аргумента, мультиметоды гораздо более гибки, что позволяет осуществлять диспетчеризацию на основе любой функции аргументов метода (любых).

Полиморфизм a la carte означает "Выберите любую стратегию полиморфизма, наиболее подходящую для вашего случая. Все они есть в вашем наборе инструментов".

Вы можете реализовать TypeClass шаблон в Scala с использованием последствий. Прочитайте источник Scalaz, если вы хотите примеры из реального мира. Scala не поддерживает мультиметоды на уровне языка, но я думаю, что это возможно с помощью предстоящего макроса 2.10.

Что касается преимуществ, передовые стратегии полиморфизма, такие как TypeClass и Multimethod, могут помочь решить проблему выражения.

"Цель состоит в том, чтобы определить тип данных по случаям, когда можно добавить новые случаи к типу данных и новые функции над типом данных, без перекомпиляции существующего кода и при сохранении безопасности статического типа (например, без приведения)".

Кстати, этот вопрос слишком велик, чтобы вписаться в один вопрос Stackru. Я предлагаю ознакомиться с этими понятиями, и тогда вы поймете их полезность.

Другие вопросы по тегам