Was ist „Polymorphismus à la carte“ und wie kann ich davon profitieren?

72

In seinem Vortrag Simple Made Easy spricht Rick Hickey über " Polymorphism a la carte " (ca. 30:00 im Video). Im gleichen Zusammenhang erwähnt er auch Haskells Typklassen und Clojures Multi-Methoden (und Protokolle).

Da ich mit diesen Konzepten nicht sehr vertraut bin, möchte ich ihre Nützlichkeit verstehen, wenn ich versuche, Einfachheit zu erreichen . Ich interessiere mich besonders für Beispiele oder Vitrinen dieses Konzepts in Scala .

Grega Kešpret
quelle

Antworten:

37

Sie können Polymorphismus à la carte als Polymorphismus nach Bedarf verwenden .

Die Clojure-Community ist stolz auf den Begriff Polymorphismus à la carte, da Clojure mehrere Polymorphismusstrategien unterstützt. Einige von ihnen sind:

  • Prototypbasierter Polymorphismus

  • Vererbungspolymorphismus

    Dies ist die von Java verwendete Polymorphismusstrategie. Clojure unterstützt dies durch Proxy. Nützlich bei Java Interop.

  • Protokoll

    Das Protokoll zu Clojure ist als TypeClass zu Haskell.

  • Multimethode

    Während Protokolle einen polymorphen Versand basierend auf dem Typ des ersten Arguments bereitstellen, sind Multimethoden viel flexibler, die basierend auf einer beliebigen Funktion der (beliebigen) Argumente der Methode versenden können.

Polymorphismus à la carte bedeutet "Wählen Sie die für Ihren Fall am besten geeignete Polymorphismusstrategie aus. Sie befinden sich alle in Ihrer Toolbox."

Sie können TypeClassMuster in Scala mithilfe von Implikits implementieren . Lesen Sie die Scalaz-Quelle, wenn Sie Beispiele aus der Praxis wünschen. Scala unterstützt keine Multimethoden auf Sprachebene, aber ich denke, dies ist mit Hilfe des kommenden 2.10-Makros möglich.

In Bezug auf die Vorteile können fortschrittliche Polymorphismusstrategien wie TypeClass und Multimethod zur Lösung des Ausdrucksproblems beitragen .

"Das Ziel besteht darin, einen Datentyp nach Fällen zu definieren, in denen dem Datentyp neue Fälle und neue Funktionen über den Datentyp hinzugefügt werden können, ohne dass vorhandener Code neu kompiliert werden muss, während die Sicherheit des statischen Typs erhalten bleibt (z. B. keine Umwandlungen)."

Übrigens ist diese Frage zu groß, um in eine einzelne StackOverflow-Frage zu passen. Mein Vorschlag ist, sich mit diesen Konzepten vertraut zu machen, und dann werden Sie ihre Nützlichkeit verstehen.

xiefei
quelle
1
Sehr kleiner Nitpick, aber wenn "Protokolle einen polymorphen Versand basierend auf dem Typ des ersten Arguments bereitstellen", entsprechen sie nicht den Haskell-Typklassen. Typklasseninstanzen können für alles "versenden" (Sie können sogar Typfunktionen mit Nullargumenten verwenden, die einen Wert in einer Instanz einer Typklasse wie zurückgeben read, und der Typ, von dem der Rückgabewert erwartet wird, bestimmt, welche Instanz verwendet wird).
Ben
1
readbraucht natürlich ein Argument. Ich bin mir nicht sicher, wo mein Gehirn war, als ich das schrieb. memptyist ein Beispiel für das, worüber ich gesprochen habe. readDer Versand erfolgt jedoch basierend auf dem erwarteten Rückgabetyp.
Ben
" [...] Ziel ist es, einen Datentyp nach Fällen zu definieren, in denen dem Datentyp neue Fälle und über den Datentyp [...] neue Funktionen hinzugefügt werden können ." ... Was ist hier mit Fall gemeint ?
Abdull