2

次のように、カスタムタイプの数値の関連付けがあります。

let DiffNumerics =
{ new INumeric<Diff> with
      member op.Zero = C 0.0
      member op.One = C 1.0
      member op.Add(a,b) = a + b
      member op.Subtract(a,b) = a - b
      member op.Multiply(a,b) = a * b
      member ops.Negate(a) = Diff.negate a
      member ops.Abs(a) = Diff.abs a
      member ops.Equals(a, b) = ((=) a b)
      member ops.Compare(a, b) = Diff.compare a b
      member ops.Sign(a) = int (Diff.sign a).Val
      member ops.ToString(x,fmt,fmtprovider) =  failwith "not implemented"
      member ops.Parse(s,numstyle,fmtprovider) = failwith "not implemented"
}

GlobalAssociations.RegisterNumericAssociation(DiffNumerics)

f#インタラクティブでは正常に動作しますが、これらのタイプのマトリックスに対して.ElementOpsが正しく入力されていないため、実行するとクラッシュします。なぜこれが起こるのか、何か考えはありますか?

編集:

fsiでは、コード

let A = dmatrix [[Diff.C 1.;Diff.C 2.;Diff.C 3.];[Diff.C 4.;Diff.C 5.;Diff.C 6.]]
let B = matrix [[1.;2.;3.];[4.;5.;6.]]

与える:

> A.ElementOps;;
val it : INumeric<Diff> = FSI_0003.NewAD+DiffNumerics@258
> B.ElementOps;;
val it : INumeric<float> = Microsoft.FSharp.Math.Instances+FloatNumerics@115
> 

デバッガーでA.ElementOpsは次のように表示します。

'(A).ElementOps' threw an exception of type 'System.NotSupportedException'

そして、B行列の場合:

Microsoft.FSharp.Math.Instances+FloatNumerics@115

したがって、どういうわけか、DiffNumericsはコンパイルされたプログラムに到達していません。

4

1 に答える 1

0

答えではありませんが、問題は解決します。

GlobalAssociations.RegisterNumericAssociation(DiffNumerics)がどういうわけか実行されていませんでした。それを実行する初期化関数を追加すると、DiffNumericsがすでにロードされているというエラーで失敗しますが、その後は問題ありません。initialisation()を呼び出さない場合(すでにロードされていると表示されるため失敗します)、ロードされず、ElementOpsは上記のエラーを返します。

実際に何が起こっているのかを理解する時間ではありません...

N

于 2012-07-06T14:59:52.787 に答える