【问题标题】:haskell, how to unwrap IO monad [duplicate]haskell,如何解开 IO monad [重复]
【发布时间】:2016-08-12 06:13:40
【问题描述】:

我可以:runIdentity、runErrorT 等等来解开内部单子。
但是,如果出现IO (Either String Int),我该怎么办?如何打开它?

【问题讨论】:

  • 您不能“解包”这种类型 - 您可以“解包”诸如 Identity 和 ErrorT 之类的东西,因为它们只是其他类型的新类型。

标签: haskell io monads


【解决方案1】:

您不会解开 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 没有构造函数
  • @HaskellFun 你可以教纯价值观如何成为IO——就像return :: a -&gt; IO a一样。
  • @HaskellFun 如果您需要帮助,您将不得不说更多。为什么对你没有帮助?你尝试了什么?出了什么问题?
  • @HaskellFun 正如我之前评论中所建议的:使用return,如fmap (+1) (return 21)。
  • @HaskellFun 如果您还有其他问题,我鼓励您打开一个新的顶级线程。另请注意,IO 是一个类型构造函数,但有 no 术语构造函数名为 IO —— 所以 IO (Right 12) 不是一个很好的思维模型。请继续阅读建议的进一步阅读;我想它会消除你的许多误解。
猜你喜欢
  • 1970-01-01
  • 2011-10-13
  • 2013-05-16
  • 2013-08-15
  • 1970-01-01
  • 1970-01-01
  • 2016-03-03
  • 2012-06-08
  • 1970-01-01
相关资源
最近更新 更多