Die Antwort hängt davon ab, welches Problem Sie lösen möchten. F # verfügt nicht über Typklassen und GADTs, daher gibt es keine direkte Zuordnung. F # verfügt jedoch über verschiedene Mechanismen, mit denen Sie Probleme lösen können, die Sie in Haskell normalerweise mithilfe von GADTs und typeclasses lösen:
Wenn Sie Objektstrukturen darstellen und neue konkrete Implementierungen mit unterschiedlichem Verhalten hinzufügen wollen, können Sie häufig Standard-OO und Schnittstellen verwenden.
Wenn Sie generischen numerischen Code schreiben möchten, können Sie statische Member-Constraints verwenden ( hier ist ein Beispiel) ), das ist wahrscheinlich technisch der am besten geeignete Mechanismus zum Eingeben von Klassen.
Wenn Sie erweiterten generischen Code (wie universellen Drucker oder Parser) schreiben möchten, können Sie häufig die leistungsstarke F # Laufzeit Reflexion Fähigkeiten.
Wenn Sie Code mit einer Reihe von Funktionen parametrisieren müssen (die verschiedene vom Code benötigte Unteroperationen ausführen), können Sie eine Implementierung einer Schnittstelle weitergeben, wie @pad anzeigt.
Es gibt auch eine Möglichkeit, Haskell-Typklassen in F # zu emulieren , aber das ist normalerweise kein Idiom F # -Lösung, weil sich der F # -Programmierstil in vielerlei Hinsicht vom Haskell-Stil unterscheidet. Eine ziemlich standardmäßige Verwendung davon besteht jedoch darin, überladene Operatoren zu definieren (siehe diese SO-Antwort ).
Auf der Meta-Ebene führt die Frage, was zu einem Merkmal X in einer anderen Sprache gehört, oft zu einer verwirrenden Diskussion, weil X dazu verwendet werden kann, die Probleme A, B, C in einer Sprache und in einer anderen Sprache zu lösen kann verschiedene Funktionen zur Verfügung stellen, um die gleichen Probleme zu lösen (oder einige der Probleme existieren möglicherweise gar nicht).
In F # verwenden Sie häufig Schnittstellen und vererbung für diese Zwecke.
Hier ist zum Beispiel eine einfache Typklasse, die Schnittstellen und Objektausdrücke : Es sieht vielleicht nicht sehr schön aus, aber es ist eine Art, es zu tun. Für eine mehr Haskell-ähnliche Lösung, die ein Wörterbuch der Operationen verwendet, können Sie sich diese nette Antwort