1

私は現在次のコードを持っています:

type Matrix(sourceMatrix:double[,]) =
      let rows = sourceMatrix.GetUpperBound(0) + 1
      let cols = sourceMatrix.GetUpperBound(1) + 1
      let matrix = Array2D.zeroCreate<double> rows cols
      do
        for i in 0 .. rows - 1 do
        for j in 0 .. cols - 1 do
          matrix.[i,j] <- sourceMatrix.[i,j]

  new (rows, cols) = Matrix( Array2D.zeroCreate<double> rows cols)

  new (boolSourceMatrix:bool[,]) = Matrix(Array2D.zeroCreate<double> rows cols)
        for i in 0 .. rows - 1 do
        for j in 0 .. cols - 1 do
            if(boolSourceMatrix.[i,j]) then matrix.[i,j] <- 1.0
            else matrix.[i,j] <- -1.0

私の問題は、bool[,]パラメーターを受け取る最後のコンストラクターにあります。コンパイラーは、このコンストラクターの初期化に使用しようとしている2つのforループを回避させてくれません。どうすればこれを機能させることができますか?

4

1 に答える 1

2

最も簡単な解決策は、代わりにこれを行うことです。

new (boolSourceMatrix) = Matrix(Array2D.map (fun b -> if b then 1.0 else -1.0) boolSourceMatrix)

あなたが直面していた特定の問題は、プライマリ コンストラクターの let バインド フィールドが代替コンストラクターで使用できないことです。これを回避するには、必要に応じて明示的に定義されたフィールドを使用できます。ただし、この場合は、Array2Dモジュールの追加機能を利用することをお勧めします。

于 2011-03-06T21:57:30.700 に答える