2016-08-10 3 views
0

Wenn ich eine Funktion wie, in einer Monade T, f1 :: T String, und ich möchte das Ergebnis verwenden, drucken Sie es zum Beispiel.Verwendung in IO Monade, eine Funktion von anderen Monade

seeF1 :: IO String 
seeF1 = do 
    res <- f1 
    print res 

Warum ist es falsch ?. Es scheint, dass ich f1 nicht verwenden kann, weil es nicht in der Monade IO ist. Also, wie kann ich es tun? Heben?

+3

Ich denke die Antwort auf "Wie kann ich es tun?" hängt sehr davon ab, was "T" ist und was Sie erwarten. –

Antwort

2

In do Notation, wenn Sie das tun

x = do 
    y <- z 
    .... 

Dann, wenn x :: (Monad m) => m a, dann z :: (Monad m) => m b waren m die gleiche Monade ist.

Das ist doch ziemlich logisch: stellen Sie sich vor, wenn Ihre T Monade Liste war, was sollte Ihre seeF1 zurückgeben? Oder wenn Ihre T Monade war Maybe, seeF1 wäre nicht in der Lage, nichts zu drucken, falls es eine Nothing da das Ergebnis nicht definiert wäre.

Daher ist im Allgemeinen nicht das, was Sie verlangen. Aber wenn Sie etwas genauer über Ihre T sind, dann finden Sie möglicherweise einen Weg, um eine IO a von Ihrem T a zu bekommen. Wenn Sie beispielsweise die in transformers definierten Monaden betrachten, haben viele eine run-Funktion, die sie transformiert und von der Sie eine IO erhalten können.

+4

Ich denke, Ihr Anspruch ("Sie müssen eine Hebeoperation definieren") ist viel zu stark. In der Tat haben nur wenige Monaden einen vernünftigen Weg, um in "IO" "gehoben" zu werden. Ich vermute, dass die Antwort auf die Frage eine der 'run * '-Familien von Funktionen beinhalten wird - aber es ist fast unmöglich zu wissen, bis Jonaprieto ein bisschen mehr darüber sagt, was er tun möchte. –

+0

Ja, Sie sind richtig, ich werde meine Antwort bearbeiten :) – villou24