如何打印类型(任意字符串(IO字符串))



这是一个非常非常长的故事,我不会让你厌烦,但基本上,我设法让自己处于一种需要能够打印类型Either String (IO String)的情况。有什么帮助吗?

解决方案是一个单行。。。。

either print (print =<<)

如果你想区分它是Left还是Right,它会涉及更多,请参阅@jamsihdh的答案。

请注意,这不能成为Show实例,因为对于类型为IO a的值,不能完全观察到任何内容。

解决方案不是一行代码。。。。

IO monad不是Show的实例,所以不能只使用print。事实上,IO monad中的值必须首先获得。

您可以将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 " ++))

最新更新