2012-11-25 8 views
60

Nel suo discorso Simple Made Easy, Rick Hickey parla di "Polymorphism a la carte" (circa 30:00 nel video). Nello stesso contesto, cita anche gli Type Classes di Haskell e gli Multi-Methods (e i protocolli) di Clojure.Che cos'è il "polimorfismo a la carte" e come posso trarne beneficio?

Dato che non ho molta familiarità con questi concetti, mi piacerebbe capire la sua utilità quando si cerca di raggiungere la semplicità . Sono particolarmente interessato a qualsiasi esempio o presentazione di questo concetto in Scala.

+2

Menzionato da 45:37 – Abdull

risposta

29

si può prendere polimorfismo alla carte come polimorfismo su richiesta.

La comunità dei Clojure è orgogliosa del termine Polymorphism à la carte a causa del fatto che Clojure supporta strategie di polimorfismo multiplo. Alcuni di essi sono:

  • Prototype-based polymorphism

  • Ereditarietà polimorfismo

    Questa è la strategia polimorfismo utilizzata da Java. Clojure supporta questo per procura. Utile quando si esegue l'interoperabilità di Java.

  • protocollo

    protocollo Clojure è TypeClass a Haskell.

  • Multimethod

    Mentre protocolli prevedono spedizione polimorfici in base al tipo del primo argomento, multimethods sono molto più flessibile che può inviare basato su qualsiasi funzione di (eventuali) argomenti del metodo.

polimorfismo alla carte significa "scegliere quale strategia polimorfismo migliore per il vostro caso. Sono tutti nella vostra cassetta degli attrezzi".

È possibile implementare lo schema TypeClass in Scala utilizzando impliciti. Leggi Scalaz source se vuoi esempi reali. Scala non supporta i metodi multimodali a livello di linguaggio, ma suppongo che sia possibile con l'aiuto della prossima macro 2.10.

Per quanto riguarda i vantaggi, le strategie avanzate di polimorfismo come TypeClass e Multimethod possono aiutare a risolvere Expression Problem.

"L'obiettivo è quello di definire un tipo di dati da parte dei casi, in cui si può aggiungere nuovi casi per il tipo di dati e nuove funzioni sul tipo di dati, senza ricompilare il codice esistente, e pur mantenendo la sicurezza di tipo statico (ad esempio, non calchi) ".

BTW, questa domanda è troppo grande per rientrare in una singola domanda StackOverflow. Il mio suggerimento è di familiarizzare con questi concetti, e quindi capirai la loro utilità.

+0

nitpick molto piccolo, ma se "i protocolli forniscono un dispiegamento polimorfico basato sul tipo del primo argomento", allora non corrispondono alle classi di tipi Haskell. Le istanze di classe del tipo possono "inviare" su qualsiasi cosa (puoi anche avere funzioni di tipo zero-argomento che restituiscono un valore in un'istanza di una classe di tipo come 'read', e il tipo il valore di ritorno è * previsto * determinerà quale istanza si usa). – Ben

+1

'read' accetta un argomento, ovviamente. Non sono sicuro di dove fosse il mio cervello quando l'ho scritto. "Mempty" è un esempio di ciò di cui stavo parlando. 'read' esegue la spedizione in base al tipo di reso previsto, tuttavia. – Ben

+0

"* [...] L'obiettivo è definire un tipo di dati in base ai casi, in cui è possibile aggiungere nuovi casi al tipo di dati e nuove funzioni sul tipo di dati [...] *". ... Cosa si intende con ** caso ** qui? – Abdull