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

und*_*all 3 haskell functional-programming

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

luq*_*qui 13

解决方案是单线...

either print (print =<<)
Run Code Online (Sandbox Code Playgroud)

如果你想界定它是否LeftRight涉及更多,请参阅@ jamsihdh的答案.

请注意,这不能成为一个Show实例,因为关于类型的值没有任何内容可以纯粹观察到IO a.


jam*_*idh 7

解决方案不是一个班轮....

IO单子不是一个实例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 ++ ")")
Run Code Online (Sandbox Code Playgroud)

它应解决并打印该值.


编辑-

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

当然,现在我需要更进一步,推出一个具有相应左右标识的单线程.:)

either (print . ("Left " ++)) ((print =<<) . fmap ("Right IO " ++))
Run Code Online (Sandbox Code Playgroud)