66 Stimmen

Wozu sind Typklassen in Scala nützlich?

Wie ich aus dieser Blogbeitrag "Typklassen" sind in Scala nur ein "Muster", das mit Traits und impliziten Adaptern implementiert wird.

Wie der Blog sagt, wenn ich eine Eigenschaft habe A und einen Adapter B -> A dann kann ich eine Funktion aufrufen, die ein Argument vom Typ A mit einem Argument des Typs B ohne diesen Adapter explizit aufzurufen.

Ich fand es nett, aber nicht besonders nützlich. Könnten Sie einen Anwendungsfall/ein Beispiel nennen, der/das zeigt, wozu diese Funktion nützlich ist?

4voto

Jonathan Warden Punkte 2454

Eine Möglichkeit, Typklassen zu betrachten, ist, dass sie Folgendes ermöglichen rückwirkende Verlängerung o retroaktiver Polymorphismus . Es gibt eine Reihe von großartigen Beiträgen von Gelegenheits-Wunder y Daniel Westheide die Beispiele für die Verwendung von Type Classes in Scala zeigen, um dies zu erreichen.

Hier ist ein Beitrag in meinem Blog das verschiedene Methoden in Scala erforscht, die rückwirkende Supertypisierung eine Art rückwirkende Erweiterung, einschließlich eines Beispiels für eine Typklasse.

1voto

lisak Punkte 20709

Ich kenne keinen anderen Anwendungsfall als Ad-hoc-Polymorhismus die erklärt wird aquí auf die bestmögliche Weise.

1voto

Beide Implikationen y Typklassen werden verwendet für Typenumwandlung . Der wichtigste Anwendungsfall für beide ist die Bereitstellung Ad-hoc-Polymorphismus (d.h. auf Klassen, die Sie nicht ändern können, aber eine Art Vererbungspolymorphismus erwarten. Im Falle von Implikaten können Sie sowohl ein implizites def als auch eine implizite Klasse (die Ihre Wrapper-Klasse ist, aber vor dem Client verborgen bleibt) verwenden. Typklassen sind leistungsfähiger, da sie einer bereits bestehenden Vererbungskette Funktionalität hinzufügen können (z.B.: Ordering[T] in Scalas Sortierfunktion). Weitere Einzelheiten finden Sie unter https://lakshmirajagopalan.github.io/diving-into-scala-typeclasses/

1voto

Nihat Hosgur Punkte 94

In Scala Typklassen

  • Ermöglicht Ad-hoc-Polymorphismus
  • Statisch typisiert (d.h. typsicher)
  • Ausgeliehen von Haskell
  • Löst das Ausdrucksproblem

B - zur Kompilierzeit - im Nachhinein - ohne Änderung/Rekompilierung von bestehendem Code

Scala-Implikate

Die letzte Parameterliste einer Methode kann als implizit gekennzeichnet werden

  • Implizite Parameter werden vom Compiler ausgefüllt

  • In der Tat benötigen Sie einen Nachweis des Compilers

  • wie zum Beispiel das Vorhandensein einer Typklasse im Geltungsbereich

  • Sie können bei Bedarf auch explizit Parameter angeben

Unten Beispiel Erweiterung auf String Klasse mit Typ Klasse Implementierung erweitert die Klasse mit einer neuen Methoden, obwohl String ist endgültig :)

/**
* Created by nihat.hosgur on 2/19/17.
*/
case class PrintTwiceString(val original: String) {
   def printTwice = original + original
}

object TypeClassString extends App {
  implicit def stringToString(s: String) = PrintTwiceString(s)
  val name: String = "Nihat"
  name.printTwice
}

0voto

jhegedus Punkte 19354

Diese ist ein wichtiger Unterschied (der für die funktionale Programmierung erforderlich ist):

enter image description here

berücksichtigen. inc:Num a=> a -> a :

a der empfangene Wert derselbe ist wie der zurückgegebene, kann dies nicht durch Subtypisierung erreicht werden

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X