【问题标题】:Convert IO [String] to String [duplicate]将 IO [字符串] 转换为字符串 [重复]
【发布时间】:2014-10-18 13:46:22
【问题描述】:

我了解卷曲的内容。找到正确的数据并在其基础上形成以下查询。 但是数据的类型是IO [String]。请求简单String。 如何将IO [String]转换为String

【问题讨论】:

    标签: haskell


    【解决方案1】:

    没办法。你能得到的只有IO String

    看看这些relatedquestions 了解原因。

    【讨论】:

    • 这是唯一正确的答案; unsafePerformIO 在这里只需要一个脚注。
    【解决方案2】:

    您可以使用unsafePerformIO(其类型为IO a -> a,因此不纯),但这几乎肯定不是您要找的。相反,您可以使用fmap>>= 对字符串执行操作:

    f :: String -> Int
    f = read
    
    io :: IO String
    io = getLine
    
    main :: IO ()
    main = (f `fmap` io) >>= \x -> print x
    

    fmap>>= 的结果当然对于某些a 总是IO a,以保持引用透明度。

    【讨论】:

      【解决方案3】:

      这是邪恶的(你没有从我这里听到!)但是:unsafePerformIO

      我只是在谈论类型系统。如果您想使用它,请仔细阅读文档!
      顾名思义,它是不安全的,这意味着您需要额外确保您的使用是有意义的。

      【讨论】:

      • unsafePerformIO 不仅仅是邪恶的,它在 Haskell 语言中并不真正存在——只是,GHC 已将其添加到其实现中,因此您可以优化一些低级的东西(通常,通过调用绑定到 C 库)。
      • @leftaroundabout 它不是 FFI 规范的一部分吗?
      • @alternative:FFI 规范确实是 Haskell2010 报告的一部分;我仍然不会认为它是 Haskell 语言的一部分。反正System.IO.Unsafe模块在the report中没有提到,还是我漏掉了?
      • @leftaroundabout 我的印象是 unsafePerformIO 最初被定义为 FFI 模块中的某些东西,然后后来移至 System.IO.Unsafe。但我对规范不是很熟悉,所以我不确定它是否已被定义为 FFI,或者是否真的如此。但我很确定它实际上是 FFI 的一部分。那或者我在想象……
      • @leftaroundabout 所以我不是完全疯了,至少。在 Haskell 98 时代,它被定义为 FFI 的一部分,但我在 2010 年的报告中找不到它。 cse.unsw.edu.au/~chak/haskell/ffi/ffi/ffise5.html#x8-230005
      猜你喜欢
      • 2011-08-22
      • 2014-07-06
      • 1970-01-01
      • 2021-10-18
      • 2020-12-05
      • 2018-01-27
      • 2016-11-23
      • 1970-01-01
      • 2013-06-05
      相关资源
      最近更新 更多