Erstellen von Monaden in Haskell

8

Ich möchte meine eigene Monade erschaffen. Das habe ich geschrieben:

%Vor%

Aber das funktioniert nicht. Ghc sagt:

%Vor%

Was ist daran falsch?

Ich möchte Berechnungen durchführen, während ich niedriger als n bin. n sollte Konstanten sein, von denen ich noch nicht weiß, wie man das richtig macht. Es sollte eine Mischung aus State und Maybe sein. Wenn Sie einige Ratschläge haben, können Sie es mit mir teilen: P

    
qba 22.11.2009, 17:58
quelle

3 Antworten

11

Über return :

%Vor%

So nimmt return ein Argument vom Typ a und gibt etwas vom Typ m a zurück. In diesem Fall ist m LeafConType , also wird LeafConType a zurückgegeben.

Angenommen, wir übergeben True . Dann a = Bool , also muss der Rückgabetyp LeafConType Bool sein. Sie definieren jedoch:

%Vor%

So wird return True zu LeafCon True . Aber das ist nicht erlaubt, weil die Typdefinition von LeafConType besagt, dass

%Vor%

Also muss für LeafConType Bool das Argument für LeafCon den Typ (Bool, Int, Int) haben, nicht nur Bool . Und das heißt, der Kompilierfehler bedeutet: a kann nicht mit (a, Int, Int) identisch sein. Sie sagen:

  

Ich möchte Berechnungen durchführen, während i niedriger ist als n .

Dies bedeutet, dass Sie einige Standardwerte für i und n benötigen, da es sonst unmöglich ist, return zu definieren. Wenn beide standardmäßig Null sind, können Sie Folgendes definieren:

%Vor%

Über (>>=) :

%Vor%

Sehen Sie sich nun Ihre Implementierung an (etwas andere Schreibweise, gleiche Idee):

%Vor%

Was wir hier sehen, ist, dass lc zurückgegeben wird, wenn i >= n . Aber lc ist vom Typ LeafConType a , während f eine Funktion ist, die einen Wert vom Typ LeafConType b zurückgeben kann, für any b . Daher könnte b nicht gleich a sein und daher stimmen diese Typen nicht überein. Abschließend müssen Sie sich ernsthaft eine Frage stellen:

Kann diese Art der Berechnung trotzdem als Monade ausgedrückt werden?

    
Stephan202 22.11.2009, 18:17
quelle
6

Die Funktionen, die Sie für >>= und return angegeben haben, erfüllen nicht die von Monad benötigten Typen:

%Vor%

Angesichts der Erklärung

%Vor%

Sie geben der Funktion den inkompatiblen Typ

%Vor%

Eine Aussage wie return 42 wäre daher in Ihrer Monade unmöglich.

Ich verstehe nicht, was deine Monade überhaupt tun soll. Sehen Sie sich zuerst einfache, funktionierende Monaden an!

%Vor%     
Dario 22.11.2009 18:16
quelle
3

Nach Ihrer Beschreibung von dem, was Ihre Monade tun soll, denke ich, dass Sie etwas ähnliches wollen:

%Vor%

Einige Beispiele:

%Vor%

Ich habe das ziemlich schnell zusammengeschmuggelt, es ist ziemlich hässlich, und ich habe nicht überprüft, ob es irgendwelche Monad-Gesetze befolgt, also benutze es auf eigene Gefahr! :)

    
Alasdair 23.11.2009 12:16
quelle

Tags und Links