在我看来,功能纯度的力量是当深层代码路径可以被验证为无副作用的时候。在代码树的规模方面,人们可以在一个纯说明符中体验到什么,以及代码重用的水平如何?
我发现了几件事:
std.algorithm通常没有标记为pure,但可能很大程度上是纯的,要么通过要求实例化函数或mixin纯度的纯算法,要么通过纯度说明符本身具有静态多态性。
像to!string( someInt )这样有用的转换器目前并不是纯的。
用户定义的结构似乎在以下方面存在问题(如下图所示):
上也是纯的后期函数。
以下代码当前在DMD 2.052 win 32位上出现多个错误。
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();
}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' 发布于 2011-04-28 03:05:32
理论上,pure在D中的意义在于它应该允许保证一个函数是无副作用的,而不管该函数是如何实现的。D有两种纯度:
pure的函数都是弱纯的。它们不能访问任何全局可变状态(全局变量、线程局部变量、static变量等)。或者执行I/O,但是,他们可能会改变他们的论点。这些函数的要点是,它们可以从强纯函数(详见下文)调用,而不违反强纯的保证。const和immutable类型构造函数来保证这一点。(在处理结构和类时,this指针被视为参数。)强纯函数具有人们所谈论的所有好的特性,即使它们是使用可变状态实现的。强纯函数对于任何给定的参数总是返回相同的值,并且没有明显的副作用。强纯函数是引用透明的,这意味着它们的返回值可以用给定的一组参数代替对它们的调用,而不会影响可观察的行为。任何强纯函数都可以安全地与任何其他强纯函数并行执行。不幸的是,泛型代码与pure (以及const和immutable)之间的交互非常糟糕。有几项解决这一问题的建议,但尚未得到接受。
\std.algorithm是尽可能通用的,所以它不能要求它的lambda函数和它接受的范围是纯的。此外,在D2中添加的类型系统特性通常是语言中最有缺陷的特性,因为在修复相关问题之前,已经对更基本的功能进行了优先处理。现在,pure基本上是不可用的,除了std.math这样的琐碎情况。
https://stackoverflow.com/questions/5812186
复制相似问题