D中的纯函数式编程

Joh*_*ohn 22 functional-programming d side-effects

在我看来,功能纯度的强大之处在于深度代码路径可以被验证为无副作用.人们在代码树规模上的经验是什么,可以在纯粹的说明符中,以及代码重用的级别是什么?

我发现的一些事情:

std.algorithm大部分都没有被标记为pure,但可能很大程度上是纯粹的,要么是纯粹的算法需要实例化函数或mixin的纯度,要么纯度说明符本身是静态多态的.
有用的转换器to!string( someInt )目前不是纯粹的.

用户定义的结构似乎有问题(如下所示):
1.嵌套结构上的纯析构函数
2.纯粹的postblit函数,即使在非嵌套结构上也是如此

以下代码目前在DMD 2.052 win 32-bit上给出了多个错误

struct InnerStruct
{
    pure this(this) {}
    pure ~this() {}
}

struct OuterStruct
{
    InnerStruct innerStruct;
    pure this(this) {}
    pure ~this() {}
}

pure void somePureFunc()
{
    OuterStruct s1 = OuterStruct(); // pure nested destructor does not compile
    OuterStruct s2 = s1;
    InnerStruct is1 = InnerStruct(); // pure non-nested destructor seems to compile
    InnerStruct is2 = is1; // pure non-nested postblit does not compile
}

void main()
{
    somePureFunc();
}
Run Code Online (Sandbox Code Playgroud)
pure_postblit.d(18): Error: pure function 'somePureFunc' cannot call impure function '__cpctor'  
pure_postblit.d(20): Error: pure function 'somePureFunc' cannot call impure function '__cpctor'  
pure_postblit.d(18): Error: pure function 'somePureFunc' cannot call impure function '~this'  
pure_postblit.d(17): Error: pure function 'somePureFunc' cannot call impure function '~this'  
Run Code Online (Sandbox Code Playgroud)

dsi*_*cha 21

从理论上讲pure,D中的观点是它应该允许保证函数是无副作用的,无论该函数是如何实现的.D中有两种纯度:

  • 标记的所有功能pure都是纯粹的.它们可能无法访问任何全局可变状态(全局变量,线程局部变量,static变量等)或执行I/O. 然而,他们可能会改变他们的论点.这些功能的关键在于它们可以从强大的纯函数(下面详述)中调用,而不会违反强纯度的保证.

  • 这是弱纯的所有功能,并没有与可变间接任何参数有很强的纯净.该constimmutable类型构造可用来保证这一点.(当处理结构和类时,this指针被认为是一个参数.)强大的纯函数具有函数式编程人员所讨论的所有优秀属性,即使它们是使用可变状态实现的.强纯函数始终为任何给定参数返回相同的值,并且没有可观察到的副作用.强纯函数是引用透明的,这意味着它们的返回值可以用一组给定的参数替代对它们的调用,而不会影响可观察的行为.任何强大的纯函数都可以与任何其他强纯函数并行安全地执行.

不幸的是通用代码和之间的相互作用pure(以及constimmutable)比较差.有几个建议要解决这个问题,但尚未接受任何建议.
\ std.algorithm被编写为尽可能通用,因此它不能要求它的lambda函数和它接受的范围是纯的.此外,在D2中添加的类型系统功能通常是语言中最多的功能,因为在修复相关问题之前已经优先考虑了更多基本功能.现在,pure除了像std.math这样的小事外,基本上是不可用的.