Что такое "полиморфизм а-ля-карт" и как я могу извлечь из этого пользу?
В своем выступлении " 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. Я предлагаю ознакомиться с этими понятиями, и тогда вы поймете их полезность.