这是一个非常非常长的故事,我不会让你厌烦,但基本上,我设法让自己处于一种需要能够打印类型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 " ++))