【问题标题】:How to print the type (Either String (IO String))?如何打印类型(字符串(IO字符串))?
【发布时间】:2014-09-26 03:00:03
【问题描述】:

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

【问题讨论】:

  • 为了避免将来出现这种情况,我建议阅读this answer 我写过的关于 Functor 的文章,包括“fmap 可以在任何东西上工作”和“在 IO 上使用 fmap 尤其酷”部分.

标签: haskell functional-programming


【解决方案1】:

解决方案是单线......

either print (print =<<)

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

请注意,这不能作为Show 实例,因为对于IO a 类型的值,无法纯粹观察到任何内容。

【讨论】:

    【解决方案2】:

    解决方案不是单一的....

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

    【讨论】:

    • 更简洁的一种方法是:sequenceA &gt;=&gt; print
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多