6

C# の型システムを悪用することで、不可能な操作が実行されないように、コンパイラがルールを適用するコードを作成できます。以下のコードでは、行列の乗算に固有です。

明らかに、以下は完全に非現実的/間違っていますが、Matrix<2,2> のような型を定義し、コンパイラに安全性を確保させることができる将来、C# でこのようなものを使用できない理由はありますか?

また、このようなものは主流の言語に存在しますか? C ++でのメタプログラミングでこのようなことが可能になるのではないかと思います??

public abstract class MatrixDimension { }

public class One : MatrixDimension { }
public class Two : MatrixDimension { }
public class Three : MatrixDimension { }

public class Matrix<TRow, TCol>
    where TRow : MatrixDimension
    where TCol : MatrixDimension
{

// matrix mult. rule. N×M * M×P  = N×P 
    public Matrix<TRow, T_RHSCol> Mult<T_RHSCol>(Matrix<TCol, T_RHSCol> rhs)
        where T_RHSCol : MatrixDimension
    { return null;}
}

public class TwoByTwo : Matrix<Two, Two> { }

public void Main()
{
    var twoByTwo = new Matrix<Two, Two>();
    var oneByTwo = new Matrix<One, Two>();
    var twoByThree = new Matrix<Two, Three>();
    var threeByTwo = new Matrix<Three, Two>();
    var _twoByTwo = new TwoByTwo();

    var _2x2 = twoByTwo.Mult(twoByTwo);
    var _1x2 = oneByTwo.Mult(twoByTwo);
    var _3x3 = twoByThree.Mult(threeByTwo);

    var _2x2_ = _twoByTwo.Mult(twoByTwo);

    var invalid = twoByThree.Mult(twoByThree); // compile fails, as expected
}
4

1 に答える 1

2

F# は、言語に組み込まれた測定単位をサポートしています。基本的には、ジェネリックでやり始めたように、CLR 型の上に、より豊富な型システムを作成します。

より豊富な型システムを構築するための別の、そして私が主張する補完的なアプローチ(コアモジュールで高い信頼性と正確性を確保するために私自身のソフトウェアで使用しています)は、コンパイラを定理証明器と組み合わせて使用​​ することです。メソッドとプロパティ (およびクラス不変条件) の事前条件と事後条件が満たされていること。

これは、 SPARKAdaJava (JML 拡張機能を介して)などの主流の言語でよく知られています。Microsoft Research のコード コントラクト機能のおかげで、C# でも利用できます。(私はこれを多用しています。MSR ページにリンクされているビデオを見ることを強くお勧めします。これらのツールを使い始めるのに最適な方法です。)

MSRのcccheck静的チェッカーは、Visual Studio のバックグラウンドで実行でき、コード エディターに (紫色だと思います) 波線と共にエラー メッセージと情報メッセージを表示します。

その道をたどりたい場合は、Code Contracts MSDN フォーラムでサポートを確認してください。ほとんどのユーザーはここにたむろしているようです。

于 2012-06-23T02:58:48.180 に答える