使用unsafePerformIO合适吗?

时间:2014-02-08 14:34:18

标签: haskell monads

是否正在使用unsafePerformIO允许对纯代码中的非更改文件进行只读IO调用,否则会导致很多问题?

主要原因是因为我想将它们存储在容器中,例如,使它们成为Ord的实例,但我似乎无法想象如何在不包含IO调用的情况下执行此操作{1}}。

1 个答案:

答案 0 :(得分:2)

安全

以您描述的方式使用unsafePerformIO不应导致任何问题。

拇指规则是:如果您使用unsafePerformIO来定义一个可以在Haskell中定义的函数,那么您就是在安全地使用它。

在您的情况下,您基本上使用它来实现在代码中定义一些固定值的相同效果。也就是说,您可以在源代码中包含只读的不变文件,但代价是将大量数据保存在内存中。所以你的使用是安全的。

例如,如果你发明了一个素数测试,它以某种方式利用了一个固定的100MB数据表,那么使用unsafePerformIO来访问包含它的不可变文件是没有问题的。这将在不影响安全性的情况下交换代码纯度以实现性能(内存占用)。

适当性

由于unsafePerformIO确实不安全(证明程序安全的负担在你身上),它应该被视为最后的手段,绝对不是读取文件内容的默认方式。

很难理解你的案例是否真的有理由使用unsafePerformIO。您应该更详细地描述您想要实现的目标。

我猜想,如果你的程序要读取文件并将它们的全部内容存储在内存中,那么unsafePerformIO就没有性能优势,你应该使用纯代码。