2016-04-19 22 views
0

auszupacken Ich kann tun: runIdentity, runErrorT und mehr zu inneren monad auszupacken.
Was soll ich jedoch im Fall von IO (Either String Int) tun? Wie man es auspackt?Haskell, wie IO IO Monad

+0

Sie nicht "wickeln" diesen Typ - Sie können Dinge wie "Identität" und "ErrorT", weil Sie sind einfach neue Typen für andere Typen. – user2407038

Antwort

2

Sie nicht IO a Aktionen auspacken. Stattdessen fügen Sie sie in die Aktion main ein (die über einen IO-Typ verfügt und daher solche Aktionen verwenden kann), und der Compiler stellt sicher, dass main ausgeführt wird.

Sie können auch Funktionen lehren, die nicht verstehen, IO, wie man mit IO umgehen; zum Beispiel haben wir:

fmap :: (a -> b) -> IO a -> IO b 
(=<<) :: (a -> IO b) -> IO a -> IO b 

Wenn Sie also eine Funktion, die eine Either String Int verbraucht, können Sie eine der oben genannten Funktionen verwenden kann es zu lehren, wie ein IO (Either String Int) statt zu konsumieren.

Für weitere Informationen können Sie genießen The IO Monad for People Who Simply Don't Care. (Ich mag auch die Monad-Tutorials You Could Have Invented Monads! (And Maybe You Already Have.) und All About Monads, obwohl sie weniger direkt für diese Frage relevant sind.)

+0

'fmap (+1) (IO 1)' gib Fehler: kein Konstruktor für 'IO' –

+0

@HaskellFun Du kannst reinen Werten beibringen wie' IO'-artig mit 'return :: a -> IO a'. –

+0

Es hilft mir nicht –