2012-11-25 2 views
60

В своем выступлении Simple Made Easy Рик Хики рассказывает о «Полиморфизм a la carte» (около 30:00 в видео). В этом же контексте он также упоминает Type Classes Хаскелла и Clojure's Multi-Methods (и протоколы).Что такое «полиморфизм a la carte» и как я могу извлечь из этого выгоду?

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

+2

Упоминается с 45:37 – Abdull

ответ

29

Вы можете взять Полиморфизм a la carte as Полиморфизм по запросу.

Сообщество Clojure гордится тем, Некоторые из них являются:

  • Prototype-based polymorphism

  • Наследование Полиморфизм

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

  • Протокол

    Протокол к Clojure как к Haskell класса типов.

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

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

полиморфизм порционный означает «Выберите любую стратегию полиморфизма лучше всего подходит для вашего случая. Они все в вашей панели инструментов.»

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

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

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

BTW, этот вопрос слишком велик, чтобы вписаться в один вопрос StackOverflow. Мое предложение - познакомиться с этими понятиями, и тогда вы поймете их полезность.

+0

Очень маленькая nitpick, но если «протоколы предоставляют полиморфную отправку на основе типа первого аргумента», то они не соответствуют классам типа Haskell. Типовые экземпляры класса могут «отправлять» на что угодно (вы можете даже иметь функции типа с нулевым аргументом, возвращающие значение в экземпляре класса типа, такого как 'read', и тип возвращаемого значения * ожидается * будет определять, какой экземпляр используется). – Ben

+1

'read' действительно принимает аргумент, конечно. Не знаю, где мой мозг был, когда я это написал. «mempty» - пример того, о чем я говорил. Однако 'read' отправляет на основе ожидаемого типа возврата. – Ben

+0

"* [...] Цель состоит в том, чтобы определить тип данных по случаям, где можно добавить новые случаи к типу данных и новым функциям над типом данных [...] *". ... Что подразумевается под ** случаем ** здесь? – Abdull