Подтвердить что ты не робот

Что такое "полиморфизм a la carte" и как я могу извлечь из этого выгоду?

В своем выступлении Простой Made Easy Рик Хики говорит о Полиморфизме a la carte "(около 30:00 в видео), В этом же контексте он также упоминает Haskell Type Classes и Clojure Multi-Methods (и протоколы).

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

4b9b3361

Ответ 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. Мое предложение - познакомиться с этими понятиями, и тогда вы поймете их полезность.