【发布时间】:2016-08-12 06:13:40
【问题描述】:
我可以:runIdentity、runErrorT 等等来解开内部单子。
但是,如果出现IO (Either String Int),我该怎么办?如何打开它?
【问题讨论】:
-
您不能“解包”这种类型 - 您可以“解包”诸如
Identity和ErrorT之类的东西,因为它们只是其他类型的新类型。
我可以:runIdentity、runErrorT 等等来解开内部单子。
但是,如果出现IO (Either String Int),我该怎么办?如何打开它?
【问题讨论】:
Identity 和 ErrorT 之类的东西,因为它们只是其他类型的新类型。
您不会解开 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,尽管它们与这个问题的直接相关性较低。)
【讨论】:
fmap (+1) (IO 1) 给出错误:IO 没有构造函数
IO——就像return :: a -> IO a一样。
return,如fmap (+1) (return 21)。
IO 是一个类型构造函数,但有 no 术语构造函数名为 IO —— 所以 IO (Right 12) 不是一个很好的思维模型。请继续阅读建议的进一步阅读;我想它会消除你的许多误解。