Jar*_*rek 2 functional-programming
我想知道功能语言中所有可能的副作用方法,甚至是理论上的,而不是在实践中使用.
我知道Monads(Haskell)和Uniqueness类型(Clean).还有其他可能性吗?
在Mercury中,默认情况下(即使是IO)一切都是纯粹的,并且在不使用很少需要的功能的情况下编写不纯的代码是不可能的.
通过使用唯一性和世界状态参数,纯IO的处理方式与Clean(我相信)类似.Mercury认为唯一性是一种模式属性而不是类型属性.(在此上下文中的"模式"或多或少是数据流方向)
但是Mercury也有静态纯度系统.编译器将某些代码识别为不纯(调用外语接口,或调用已知的不纯函数/谓词,访问可变变量以及其他一些情况).必须显式声明此类代码,impure否则它是编译器错误.由于编译器知道杂质,因此不执行可能影响不纯代码的重新排序或其他优化.如果在某种程度上你可以在不纯的操作周围提供纯粹的接口,你可以向编译器保证函数/谓词实际上是纯粹的.否则,所需的杂质声明一直传播到main谓词; 如果你准备这样做,你基本上可以在水星中进行必要的编程(尽管这不会很有趣).
水星也有半精确代码的概念.这是对任何其他半精度或不纯代码的操作没有副作用的代码(纯代码根据定义不受任何其他代码的副作用的影响),但可能受到其他不纯代码的副作用的影响.这种额外的信息水平意味着那些只是不纯的调用,因为它们"看到"副作用但没有任何自身的调用仍然可以被编译器更自由地优化; 如果不需要他们的结果,他们可以被优化掉,并且只要他们不被"移动" impure通话就可以重新排序.
| 归档时间: |
|
| 查看次数: |
139 次 |
| 最近记录: |