如何打印类型(Either String(IO String))?

3

这是一个非常长的故事,我不想让你感到无聊,但基本上我发现自己需要打印类型Either String(IO String)。有什么帮助吗?


为了避免将来出现这种情况,我建议阅读我写的关于Functor的这个答案,包括“fmap works on Either something”和“在IO上使用fmap特别酷”的部分。 - AndrewC
2个回答

13

这个解决方案只需要一行代码。

either print (print =<<)

如果您想划分它是Left还是Right,需要更多的操作,请参见@jamsihdh的答案。

请注意,无法将其制作为Show实例,因为对于IO a类型的值无法纯粹地进行观察。


7

这个问题的解决方案不是一句话能概括...

IO 函子不是 Show 类的实例,所以你不能直接使用 print。实际上,首先必须获取IO函子中的值。

您可以通过将以下内容放入您的主函数来查看 x::Either String (IO String) 的值...

case x of
    Left s -> putStrLn ("Left " ++ show s)
    Right getVal -> do
             s <- getVal
             putStrLn ("Right (IO " ++ show s ++ ")")

它应该解决并打印值。


编辑-

@luqui证明了我是错的 :), 这很酷,因为我学到了一些东西...

当然现在我需要更进一步,用适当的左右指定放出一个单行程序。:)

either (print . ("Left " ++)) ((print =<<) . fmap ("Right IO " ++))

1
更简洁的一句话是:“sequenceA >=> print”。 - Josh Kirklin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接