2

次のコードを考えると...

type IMyInterface =
    abstract BoolA : bool
    abstract BoolB : bool
let myFn _boolVal (_i: IMyInterface) = if _boolVal then _i.BoolA else _i.BoolB
let myFnTrue = myFn true
let myFnFalse = myFn false

...これを含む署名ファイルを作成すると、Intellisenseが文句を言い、コンパイラが失敗します。

type IMyInterface =
    abstract BoolA : bool
    abstract BoolB : bool
val myFnTrue : (IMyInterface -> bool)
val myFnFalse : (IMyInterface -> bool)

エラーはError 10 Module 'MyModule' contains val myFnTrue : ('_a -> bool) when '_a :> MyModule.IMyInterface but its signature specifies val myFnTrue : (MyModule.IMyInterface -> bool) The types differです。( についても同様のエラーが報告されていmyFnFalseます。)

これが分からないなんて馬鹿みたい。私は何を間違っていますか?(「当然」の答えに備えて...)

4

1 に答える 1

2

署名ファイルにmyFnTruemyFnFalse署名IMyInterface -> boolがありますが、実装'a -> boolには制約があります'a :> IMyInterface自動一般化による)。つまり、実装は一般的であり、署名はそうではありません。

最も簡単な解決策は、実装を次のように変更することです。

let myFnTrue i = myFn true i
let myFnFalse i = myFn false i
于 2013-02-15T21:46:05.257 に答える