Ich versuche, den Polymorphismus höherer Ordnung in scala zu begreifen, indem ich eine sehr einfache Schnittstelle implementiere, die eine Monade beschreibt, aber ich stoße auf ein Problem, das ich nicht wirklich verstehe.
Ich habe dasselbe mit C ++ implementiert und der Code sieht so aus:
%Vor%Wenn ich versuche, dasselbe mit scala zu tun, scheitere ich:
%Vor%Der Compiler beschwert sich über:
%Vor%Was mache ich hier falsch? Es scheint ein grundlegendes Konzept zu geben, das ich nicht über Scala-Typ-Konstruktoren verstehe.
Grüße, Raichoo
Das Monad
Merkmal in Scala würde wie folgt deklariert:
Beachten Sie, dass es mit einem Typkonstruktor M[_]
parametrisiert ist. Der in Klammern gesetzte Unterstrich zeigt an, dass M
ein Typkonstruktor von Art (* -> *)
ist (d. H.% Co_de% benötigt einen Typ M
, um einen Typ A
zu konstruieren). Ihre Identitätsmonad-Instanz würde dann folgendermaßen geschrieben:
Diese Definition verwendet Namensparameter, um eine faule Semantik zu erreichen.
Monad und andere nützliche höherklassige Klassen werden von der Scalaz Bibliothek bereitgestellt, zusammen mit vielen Instanzen für die Standard Java / Scala Bibliotheken.
Wenn Sie Ihre Definition der Klasse Monad
in die folgende
Die Syntax Container[_]
gibt an, wie höhere Arten in Scala ausgedrückt werden. Die A <% Container[A]
ist eine 'Ansichtsgrenze', die besagt, dass A
implizit in Container[A]
umgewandelt werden kann. Der Textkörper der Methode verwendet diese implizite Konvertierung. Um diese Klasse zu verwenden, müssen Sie eine implizite Konvertierung im Umfang für (in Ihrem Beispiel) Int
bis Value[Int]
Sie können dann Folgendes tun
%Vor%Nicht sicher, was die beste Lösung wäre, aber in der Definition von pure in Ihrem Code:
%Vor% Was Container[A](a)
sollte tun? Bis jetzt haben Sie Container als generischen Typ XXX definiert und Sie haben keine Informationen darüber, wie Sie ein neues Objekt erstellen. Sie müssen ein Builder-Objekt als impliziten Parameter übergeben.
Sehen Sie sich an, wie die Sammlungsbibliotheken in Scala 2.8 oder der Monad-Definition in Scalaz implementiert sind.
Tags und Links scala types polymorphism higher-kinded-types monads