使用unsafePerformIO合适吗?
是否正在使用unsafePerformIO
来允许只读IO调用适当的纯代码中的不变文件,否则会导致很多问题?
主要原因是因为我想将它们存储在容器中,例如使它们成为Ord
一个实例,但我似乎无法想象如何在不将unsafePerformIO
IO调用包装的情况下这样做。
关于安全
按照您描述的方式使用unsafePerformIO
不应引起任何问题。
拇指规则是:如果您使用unsafePerformIO
来定义一个可以在Haskell中定义的函数,那么您就可以安全地使用它。
在你的情况下,你基本上使用它来达到在代码中定义一些固定值的相同效果。 也就是说,您可以将只读的不变文件包含在源代码中,但需要将大量数据保存在内存中。 所以你的使用是安全的。
例如,如果您发明了一种利用固定的100MB数据表的素数测试,那么使用unsafePerformIO
访问包含它的不可变文件是没问题的。 这将交易代码纯度以实现性能(内存占用),而不会影响安全性。
在适当性
由于unsafePerformIO
确实是不安全的(证明程序安全的责任在你身上),所以它应该被视为最后的手段,而且绝对不是读取文件内容的默认方式。
很难理解您的案例是否真正证明使用unsafePerformIO
。 你应该更详细地描述你试图达到的目标。
我猜想,如果你的程序要读取文件并将其全部内容存储在内存中,那么你将不会从unsafePerformIO
获得性能优势,而应该使用纯代码。