scala functional-programming typeclass multimethod

scala - ¿Qué es el "polimorfismo a la carta" y cómo puedo beneficiarme de él?



functional-programming typeclass (1)

En su charla Simple Made Easy , Rick Hickey habla sobre " Polimorfismo a la carta " (alrededor de las 30:00 en el video). En el mismo contexto, también menciona las clases de tipos de Haskell y los Multi-Methods (y protocolos) de Clojure.

Como no estoy muy familiarizado con estos conceptos, me gustaría entender su utilidad cuando intento lograr la simplicidad . Estoy particularmente interesado en cualquier ejemplo o vitrina de este concepto en Scala .


Puede tomar Polimorfismo a la carta como Polimorfismo a pedido .

La comunidad de Clojure está orgullosa del término Polimorfismo a la carta debido al hecho de que Clojure admite múltiples estrategias de polimorfismo. Algunos de ellos son:

  • Polimorfismo basado en prototipos

  • Polimorfismo de herencia

    Esta es la estrategia de polimorfismo utilizada por Java. Clojure admite esto por proxy. Útil al hacer la interoperabilidad de Java.

  • Protocolo

    El protocolo de Clojure es como TypeClass para Haskell.

  • Multimétodo

    Si bien los protocolos proporcionan despachos polimórficos basados ​​en el tipo del primer argumento, los multimétodos son mucho más flexibles y pueden enviarse según cualquier función de los argumentos del método (cualquiera).

Polimorfismo a la carta significa "Seleccione la mejor estrategia de polimorfismo para su caso. Están todos en su caja de herramientas".

Puede implementar el patrón TypeClass en Scala usando implicits. Lea la fuente de Scalaz si quiere ejemplos del mundo real. Scala no admite multimétodos a nivel de lenguaje, pero supongo que es posible con la ayuda de la próxima macro 2.10.

En cuanto a los beneficios, las estrategias avanzadas de polimorfismo como TypeClass y Multimethod pueden ayudar a resolver el problema de expresión .

"El objetivo es definir un tipo de datos por casos, donde uno puede agregar nuevos casos al tipo de datos y nuevas funciones sobre el tipo de datos, sin recompilar el código existente, y al mismo tiempo mantener la seguridad del tipo estático (por ejemplo, sin conversiones)".

Por cierto, esta pregunta es demasiado grande para caber en una sola pregunta de . Mi sugerencia es familiarizarme con estos conceptos, y luego comprenderá su utilidad.