Ответ 1
Вы можете взять Полиморфизм a la carte как Полиморфизм по требованию.
СообществоClojure гордится термином "Полиморфизм a la carte" из-за того, что Clojure поддерживает несколько стратегий полиморфизма. Некоторые из них:
-
Полиморфизм наследования
Это стратегия полиморфизма, используемая Java. Clojure поддерживает это через прокси. Полезно при использовании Java-взаимодействия.
-
Протокол
Протокол к Clojure - это как TypeClass для Haskell.
-
Многометодная
В то время как протоколы обеспечивают полиморфную отправку, основанную на типе первого аргумента, мультиметоды гораздо более гибкие, которые могут отправлять на основе любой функции аргументов метода (любых).
Полиморфизм a la carte означает "Выберите любую стратегию полиморфизма, наилучшую для вашего случая. Они все в вашем наборе инструментов".
Вы можете реализовать шаблон TypeClass
в Scala с помощью implicits. Прочтите источник Scalaz, если вы хотите примеры из реального мира. Scala не поддерживает многоточие на уровне языка, но я думаю, это возможно с помощью предстоящего макроса 2.10.
Что касается преимуществ, передовые стратегии полиморфизма, такие как TypeClass и Multimethod, могут помочь решить проблему Проблема выражения.
"Цель состоит в том, чтобы определить тип данных по случаям, когда можно добавлять новые типы к типу данных и новым функциям над типом данных без перекомпиляции существующего кода и при сохранении безопасности статического типа (например, без приведения)".
Кстати, этот вопрос слишком велик, чтобы вписаться в один вопрос StackOverflow. Мое предложение - познакомиться с этими понятиями, и тогда вы поймете их полезность.