Добавление перегруженного конструктора, требующего кода инициализации, к неявному типу F#

В настоящее время у меня есть следующий код:

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[,]. Компилятор не позволяет мне обойтись без двух циклов for, которые я пытаюсь использовать для инициализации в этом конструкторе. Как я могу заставить это работать?


person Beaker    schedule 06.03.2011    source источник
comment
Эта перегрузка конструктора фактически не создает матрицу в любой момент. Как вы ожидаете, что это сработает?   -  person ildjarn    schedule 07.03.2011
comment
Извините, я не зашел так далеко. В моем первом цикле for дела пошли не так.   -  person Beaker    schedule 07.03.2011


Ответы (1)


Самым простым решением было бы просто сделать это вместо этого:

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

Конкретная проблема, с которой вы столкнулись, заключается в том, что поля с привязкой let из основного конструктора недоступны в альтернативных конструкторах. Чтобы обойти это, вы можете использовать явно определенное поле, если хотите. Однако в этом случае лучше воспользоваться дополнительным функционалом модуля Array2D.

person kvb    schedule 06.03.2011