我可以这样做:runIdentity
,runErrorT
以及更多来解开内在的monad
但是,如果IO (Either String Int)
,我该怎么办?如何打开它?
答案 0 :(得分:3)
您无法解开IO a
次操作。相反,您将它们包含在main
操作(具有IO
类型,因此可以使用此类操作)中,并且编译器确保执行main
。
您还可以教授不理解IO
如何处理IO
的函数;例如,我们有:
fmap :: (a -> b) -> IO a -> IO b
(=<<) :: (a -> IO b) -> IO a -> IO b
因此,如果您有一个消耗Either String Int
的函数,您可以使用上述函数之一来教它如何使用IO (Either String Int)
。
如需进一步阅读,您可以享受The IO Monad for People Who Simply Don't Care。 (我也喜欢monad教程You Could Have Invented Monads! (And Maybe You Already Have.)和All About Monads,尽管它们与这个问题不太直接相关。)