k3kaimu
3/27/2014 - 1:30 PM

function.mdのpureの保存用

function.mdのpureの保存用

* 純粋性の強弱  
    引数に配列`int[] arr`を持つような純粋関数は外部に一切の影響を与えないと保証できるでしょうか?
    この関数は引数の配列の要素を書き換えることができるので、質問の答えはNOですね。
    このように、純粋関数のうちでも引数の値を書き換えてしまう可能性のある純粋性を、弱い純粋性(weak purity)といいます。
    対して、一切外部に影響を与えないような純粋性を強い純粋性(strong purity)といいます。
    配列やポインタを引数に取っているような関数でも、`const`や`in`によって書き換え不可能なことを明示しておけば、その関数は強い純粋性を示すようになります。

    ~~~~d
    // 弱い純粋性
    void foo(int[] arr) pure
    {
        arr[] = 0;  // arrの中身を書き換え可能
    }

    // 強い純粋性, `const`や`in`などによって、
    // 書き換えできないことを明示しておく。
    void bar(const(int)[] arr) pure
    {
        // arr[] = 0;   // NG
    }
    ~~~~

    強い純粋関数の返り値は常にユニークであるという特徴があります。
    つまり、返り値は外部との関わりを一切持っていないということです。
    この特徴によって、強い純粋関数が返す返り値はすべての修飾子付き型へ暗黙変換可能となります。

    ~~~~d
    // 強い純粋関数
    T[] newArrN(T)(size_t n) pure
    {
        return new T[n];
    }

    void main()
    {
        // sharedやinoutを含むすべての修飾子を付加することが可能
        auto marr = newArrN!int(12);
        const carr = newArrN!int(12);
        immutable iarr = newArrN!int(12);
        shared sarr = newArrN!int(12);
    }
    ~~~~