Looping über Monads in Haskell

8

Ich bin wirklich neu in Haskell, also könnte das eine dumme Frage sein. Ich habe eine Funktion

%Vor%

, dessen Ergebnis einige nützliche Informationen ausgeben wird. Jetzt möchte ich das tun:

%Vor%

Wie kann ich das als Schleife schreiben? Mein Problem ist es, die Monaden zu "verketten", was automatisch durch die do-Anweisung geschieht ...

Danke für Ihre Hilfe!

    
Sh4pe 10.02.2013, 13:00
quelle

2 Antworten

14

mapM_ foo [0,1,0,2,3] wird den Trick machen.

Was vielleicht noch wichtiger ist: "Wie findet man das heraus?" Hoogle ist ein wunderbares Werkzeug. Sie möchten eine Funktion mit der Signatur Int -> IO () auf eine Menge Int s anwenden, um eine neue IO-Aktion zu erhalten. Das, wonach du suchst, wird also die Signatur (Int -> IO ()) -> [Int] -> IO () haben, also gehen wir und fragen Sie Hoogle nach Funktionen mit dieser Unterschrift . Das zweite Ergebnis ist mapM_ , dessen Signatur ist

%Vor%

Richtig, also arbeitet mapM_ tatsächlich mit beliebigen Monaden (nicht nur IO ) und beliebigen Typen (nicht nur Int ). Wenn Sie darüber nachdenken, ist das überhaupt nicht überraschend.

    
gspr 10.02.2013, 13:11
quelle
12

Sie möchten den mapM_ -Kombinator, der eine Funktion zur Rückgabe eines monadischen Werts über eine Liste abbildet und den Bind-Operator verwendet, um die Ergebnisse zu sequenzieren:

%Vor%

Manchmal benutzen Leute gerne die umgedrehte Version

%Vor%

sieht eher nach Imperativcode aus:

%Vor%

Beachten Sie, dass ein Kombinator namens forM_ in Control.Monad definiert ist und genau dasselbe tut wie der Kombinator, den ich for genannt habe.

    
Chris Taylor 10.02.2013 13:17
quelle

Tags und Links