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
Antwort
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.)
'fmap (+1) (IO 1)' gib Fehler: kein Konstruktor für 'IO' –
@HaskellFun Du kannst reinen Werten beibringen wie' IO'-artig mit 'return :: a -> IO a'. –
Es hilft mir nicht –
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