Вот код C #, который я пытаюсь перевести:
public bool equals(Matrix matrix, int precision)
{
if (precision < 0)
{
throw new MatrixError("Precision can't be a negative number.");
}
double test = Math.Pow(10.0, precision);
if (double.IsInfinity(test) || (test > long.MaxValue))
{
throw new MatrixError("Precision of " + precision
+ " decimal places is not supported.");
}
precision = (int)Math.Pow(10, precision);
for (int r = 0; r < this.Rows; r++)
{
for (int c = 0; c < this.Cols; c++)
{
if ((long)(this[r, c] * precision) != (long)(matrix[r, c] * precision))
{
return false;
}
}
}
return true;
}
Вот что у меня есть:
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]
///The number of Rows in this Matrix.
member this.Rows = rows
///The number of Columns in this Matrix.
member this.Cols = cols
member this.Equals(matrix:Matrix, precision:int) =
if(precision < 0) then raise (new ArgumentOutOfRangeException("Precision can't be a negative number."))
let (test:double) = Math.Pow(10.0, double(precision))
if(System.Double.IsInfinity(test) || (test > double(System.Int32.MaxValue))) then raise (new ArgumentOutOfRangeException("Precision of " + precision.ToString() + " decimal places is not supported."))
let precision = int(Math.Pow(10.0, double(precision)))
Как вы видите, то, что я написал до сих пор, загружено с приведением типов, что, вероятно, означает, что мой код написан не так, как должно быть. Незаконченная часть нуждается в методе возврата первого элемента, который возвращает значение false при оценке с определенной точностью. Я уверен, что должен быть какой-то элегантный код F #, чтобы достичь этого, и, очевидно, я не рядом с ним. Я пытался выяснить, есть ли в классе Array2D какой-нибудь метод, который позволил бы мне это сделать, но я не смог найти его, если таковой имеется. Я знаю о классе PowerPack Matrix и буду использовать его в конце концов, но сейчас я пытаюсь выучить F #, переводя код C #, который я понимаю, в F #. Легче сказать, чем сделать, по-видимому. :) Я считаю, что я добавил весь соответствующий код F # в тип, который я создаю. Дайте мне знать, если я что-то упустил.