使用unsafePerformIO来允许对纯代码中的非更改文件进行只读IO调用合适吗?还是会导致很多问题?
主要原因是因为我希望将它们存储在容器中,例如,使它们成为Ord的实例,但我似乎无法想象如果不在unsafePerformIO中包装IO调用,该如何做到这一点。
发布于 2014-02-09 04:16:19
论安全
按照您所描述的方式使用unsafePerformIO应该不会造成任何问题。
经验法则是:如果你正在使用unsafePerformIO来定义一个函数,而这个函数在Haskell中没有它就可以定义,那么你就是在安全地使用它。
在您的示例中,您可以使用它来实现与在代码中定义某些固定值相同的效果。也就是说,您可以只在源代码中包含只读、不更改的文件,代价是将整个数据保留在内存中。所以你的使用是安全的。
例如,如果您发明了一个素数测试,它以某种方式利用了一个固定的100MB数据表,那么使用unsafePerformIO来访问包含它的不可变文件就可以了。这将以代码的纯洁性换取性能(内存占用),而不会影响安全性。
论适当性
由于unsafePerformIO确实是不安全的(证明程序安全的重担落在您身上),它应该被视为最后的手段,而绝对不是读取文件内容的默认方式。
很难理解您的案例是否真的证明使用unsafePerformIO是合理的。你应该更详细地描述你试图实现的目标。
我猜想,如果您的程序要读取文件并将其全部内容存储在内存中,那么您将不会从unsafePerformIO获得性能优势,而应该使用纯代码。
https://stackoverflow.com/questions/21647280
复制相似问题