Übliche Praxis für Polymorphismen höherer Ordnung in scala

7

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

    
raichoo 05.04.2010, 12:15
quelle

3 Antworten

16

Das Monad Merkmal in Scala würde wie folgt deklariert:

%Vor%

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:

%Vor%

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.

    
Apocalisp 05.04.2010, 16:18
quelle
5

Wenn Sie Ihre Definition der Klasse Monad in die folgende

ändern %Vor%

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]

haben %Vor%

Sie können dann Folgendes tun

%Vor%     
Ben Lings 05.04.2010 14:53
quelle
3

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.

    
GClaramunt 05.04.2010 14:44
quelle