【发布时间】:2014-10-18 13:46:22
【问题描述】:
我了解卷曲的内容。找到正确的数据并在其基础上形成以下查询。
但是数据的类型是IO [String]。请求简单String。
如何将IO [String]转换为String?
【问题讨论】:
标签: haskell
我了解卷曲的内容。找到正确的数据并在其基础上形成以下查询。
但是数据的类型是IO [String]。请求简单String。
如何将IO [String]转换为String?
【问题讨论】:
标签: haskell
您可以使用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,以保持引用透明度。
【讨论】:
这是邪恶的(你没有从我这里听到!)但是:unsafePerformIO。
我只是在谈论类型系统。如果您想使用它,请仔细阅读文档!
顾名思义,它是不安全的,这意味着您需要额外确保您的使用是有意义的。
【讨论】:
unsafePerformIO 不仅仅是邪恶的,它在 Haskell 语言中并不真正存在——只是,GHC 已将其添加到其实现中,因此您可以优化一些低级的东西(通常,通过调用绑定到 C 库)。
System.IO.Unsafe模块在the report中没有提到,还是我漏掉了?
unsafePerformIO 最初被定义为 FFI 模块中的某些东西,然后后来移至 System.IO.Unsafe。但我对规范不是很熟悉,所以我不确定它是否已被定义为 FFI,或者是否真的如此。但我很确定它实际上是 FFI 的一部分。那或者我在想象……