是否正在使用unsafePerformIO
允许对纯代码中的非更改文件进行只读IO调用,否则会导致很多问题?
主要原因是因为我想将它们存储在容器中,例如,使它们成为Ord
的实例,但我似乎无法想象如何在不包含IO调用的情况下执行此操作{1}}。
答案 0 :(得分:2)
以您描述的方式使用unsafePerformIO
不应导致任何问题。
拇指规则是:如果您使用unsafePerformIO
来定义一个可以在Haskell中定义的函数,那么您就是在安全地使用它。
在您的情况下,您基本上使用它来实现在代码中定义一些固定值的相同效果。也就是说,您可以在源代码中包含只读的不变文件,但代价是将大量数据保存在内存中。所以你的使用是安全的。
例如,如果你发明了一个素数测试,它以某种方式利用了一个固定的100MB数据表,那么使用unsafePerformIO
来访问包含它的不可变文件是没有问题的。这将在不影响安全性的情况下交换代码纯度以实现性能(内存占用)。
由于unsafePerformIO
确实不安全(证明程序安全的负担在你身上),它应该被视为最后的手段,绝对不是读取文件内容的默认方式。
很难理解你的案例是否真的有理由使用unsafePerformIO
。您应该更详细地描述您想要实现的目标。
我猜想,如果你的程序要读取文件并将它们的全部内容存储在内存中,那么unsafePerformIO
就没有性能优势,你应该使用纯代码。