2014-09-26 126 views
3

这是一个非常非常长的故事,我不会让你感到厌倦,但基本上,我设法让自己处于一种需要能够打印Either String (IO String)类型的状态。任何帮助?如何打印类型(任何字符串(IO字符串))?

+0

为了避免在将来出现这种情况,我建议阅读[这个答案](http://stackoverflow.com/questions/13134825/how-do-functors-work-in-haskell/13137359#13137359)我写了关于Functor的内容,包括“fmap适用于任何东西”和“在IO上使用fmap特别酷”的章节。 – AndrewC 2014-09-26 09:59:46

回答

13

的解决方案是一个内衬....

either print (print =<<) 

如果要划分是否是LeftRight它更复杂一些,看到@ jamsihdh的答案。

请注意,这不能作为Show实例,因为对于IO a类型的值没有任何值可以纯粹观察到。

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 ++ ")") 

,它应该解决并打印值。


编辑 -

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

当然现在我需要去一个继续进一步,并用适当的左和右标号表示一行。 :)

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

更简洁的一个班轮将是:''sequenceA> => print'' – 2014-10-05 18:37:13

+0

@ scrambledeggs- mind = blown :) – jamshidh 2014-10-05 18:50:30