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
return
: 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:
So wird return True
zu LeafCon True
. Aber das ist nicht erlaubt, weil die Typdefinition von LeafConType
besagt, dass
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 alsn
.
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:
(>>=)
: 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?
Die Funktionen, die Sie für >>=
und return
angegeben haben, erfüllen nicht die von Monad
benötigten Typen:
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%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! :)