Ich hatte vorher gedacht, dass ein Teil des Ziels der Implementierung war, genau dieses Problem zu vermeiden, also mache ich etwas offensichtlich dummes?
Hier ist ein Code:
%Vor%Hinweis: Ich weiß, das ist albern :) In der Praxis hat meine Befehlsklasse viele Befehle, und ich habe einen Befehl, der diese selbe Schleife ausführt ... im Grunde, einen Zustand abfragen, wenn richtig abbrechen, wenn falsch, weiter warten .
Ich möchte den Stack-Überlauf vermeiden, der dies verursacht ... Ich dachte, das war schon Trampolin, aber ich denke, ich muss es manuell nochmal machen? Gibt es einen sauberen Weg, dies innerhalb der Denkweise der freien Monade zu tun?
Aktualisierung:
Wenn ich weiter darüber nachdenke, denke ich, dass das Problem nicht die Free Monade ist, sondern die Id.Id Monade, in die wir uns bei der Evaluation einklinken ... also versuchte ich etwas wie:
%Vor%Aber das Problem dabei ist, dass es nur einen Schritt auswertet. Idealerweise möchte ich, dass runFC blockt, bis eine Bedingung erfüllt ist (oder in diesem Fall für immer eine Schleife durchlaufen wird, bis ich sie abbringe, aber ohne einen Stack-Überlauf)
Seit @ Apocalisps Antwort wurde BindRec
typeclass und foldMapRec
Methode, die für die Stack-sichere Auswertung direkt zu Id
(oder einer anderen" tail-rekursiven "Monade) verwendet werden kann. Weitere Informationen finden Sie Stack Safety for Free .
Tags und Links scala scalaz free-monad