Wie werden Aktionen codiert, die monadische Argumente mit freien (oder freieren) Monaden aufnehmen?

9

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 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 .

    In Von Null bis zu kooperativen Threads in 33 Zeilen von Haskell code verwendet der Autor Fork next next , um

    zu implementieren %Vor%

    und verwendet es dann zum Implementieren

    %Vor%

    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.

  • mplus ist insbesondere verwirrend: eine naive Codierung als

    %Vor%

    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 ?

  • Für forkExec habe ich keine Ahnung, wie ich vorgehen soll.
Petr Pudlák 20.12.2015, 19:30
quelle

1 Antwort

3

Ich werde nur auf den Freer monad Teil antworten. Erinnern Sie sich an die Definition:

%Vor%

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:

%Vor%

Als ein Beispiel:

%Vor%

So können wir eine MonadPlus -Instanz für nicht-deterministische Berechnungen definieren

%Vor%

und führe sie aus

%Vor%     
user3237465 21.12.2015 10:34
quelle

Tags und Links