Die meisten monadischen Funktionen nehmen reine Argumente und geben einen monadischen Wert zurück. Aber es gibt einige, die auch monadische Argumente brauchen, zum Beispiel:
%Vor%Jeder von ihnen scheint ein anderes Problem aufzuwerfen und ich kann keinen generischen Weg finden, solche Aktionen mit Hilfe von freien Monaden zu codieren.
In beiden Fällen In Von Null bis zu kooperativen Threads in 33 Zeilen von Haskell code verwendet der Autor und verwendet es dann zum Implementieren wobei der Eingang und der Ausgang unterschiedliche Typen haben.
Aber ich verstehe nicht, ob dies mithilfe eines Prozesses oder nur einer Ad-hoc-Idee abgeleitet wurde, die für diesen speziellen Zweck funktioniert. finally
und forkIO
besteht das Problem darin, dass das monadische Argument von einem anderen Typ ist als das Ergebnis. Aber für free müssten sie vom selben Typ sein, da IO a
durch die Typvariable des Kodierungstyps ersetzt wird, wie data MyFunctor x = Finally x x x
, die nur IO a -> IO a -> IO a
. Fork next next
, um
mplus
ist insbesondere verwirrend: eine naive Codierung als
verteilt sich auf >>=
und eine vorgeschlagene bessere Implementierung ist komplizierter. Und auch eine native Implementierung eines kostenlosen MonadPlus
wurde aus free entfernt.
In freer wird es implementiert Hinzufügen von
%Vor% Warum ist MPlus
NonDetEff Bool
anstelle von NonDetEff a a
? Und gibt es eine Möglichkeit, wie man es mit Free
, wo wir den Datentyp als Funktor verwenden müssen, anders als mit dem arbeiten lassen kann CoYoneda Funktor ?
forkExec
habe ich keine Ahnung, wie ich vorgehen soll. Ich werde nur auf den Freer
monad Teil antworten. Erinnern Sie sich an die Definition:
Jetzt mit
%Vor%können wir
definieren %Vor% Wenn Roll
auf MPlus
angewendet wird, wird a
mit Bool
vereinheitlicht und der Typ des zweiten Arguments ist Bool -> NonDetEff b
, was im Grunde genommen ein Tupel ist:
Als ein Beispiel:
%Vor% So können wir eine MonadPlus
-Instanz für nicht-deterministische Berechnungen definieren
und führe sie aus
%Vor%Tags und Links haskell monads free-monad