次のコードを検討してください。
type Base(x : float) =
member this.x = x
static member (~-) (a : #Base) = Base(-a.x)
static member Cos (a : #Base) = Base(cos a.x)
type Inherited(x : float) =
inherit Base(x)
let aBase = Base(5.0)
let aInherited = Inherited(5.0)
-aBase // OK, returns Base(-5.0)
-(aInherited :> Base) // OK, returns Base(-5.0)
-aInherited // not OK
最後の行でエラーが発生します。
error FS0001: This expression was expected to have type
Inherited
but here has type
Base
と同じcos aInherited
:同じエラーが発生しますが-(aInherited :> Base)
、cos (aInherited :> Base)
機能します。
エラー メッセージは、これらの関数が戻り値の型-
またはcos
引数の型と同じであることを要求していることを示しています。これは非常に厳しい要件のようです。
- 演算子を定義する基本型から継承するクラスの場合、すべての演算子を再定義しない限り、これは不可能です。
- これらのクラスが制御できない外部ライブラリに存在する場合、オプションはさらに制限されます。
これを回避する方法はありますか?F# ソース コードでは、cos
関数は で定義されていprim-types.fs
ます。