F#の汎用クラスを単一の型パラメータで持ち、ファクトリメソッドを含む静的クラスを作成したいと考えています。私のクラスを書くとき、F#コンパイラは "スコープをエスケープする型変数"に関連するエラーを生成します。私の質問は、エラーがそこにあり、それを修正する理由です。私はタイプFoo<'a>
がでファクトリメソッドを呼び出すことができるようにしたいと思いますので、汎用変数と非汎用クラスを結合するときの変数型エスケープスコープ
type Foo<'a>(element : 'a) =
member this.Copy() = Bar.Create(element)
and Bar =
static member Create(element : 'a) = new Foo<'a>(element)
タイプで相互再帰がある:私は問題を実証最小サイズのスニペットを作成しました
静的クラス。上記のスニペットはコンパイルされず、エラーは次のようになります。「型推論によって、型変数aがそのスコープからエスケープされました。明示的な型パラメータ宣言を追加するか、コードをあまり一般的でないように調整することを検討してください。エラーは、Bar
クラスのCreate
メソッドにあるものとして登録されています。残念ながら、私はこの問題を本当に理解していませんし、解決する方法もありません。何か案は?
これ以上のことをご説明します。スニペット
type Foo<'a>(element : 'a) =
member this.Element = element
and Bar =
static member Create(element : 'a) = new Foo<'a>(element)
コンパイルします。したがって、この問題は、Foo<'a>
クラスのCopy()
メソッドに基づいて行われる型推論に関連するように見えます。また、スニペット
type Foo<'a>(element : 'a) =
member this.Copy() = Bar.Create(element)
and Bar =
static member Create<'a>(element) = new Foo<'a>(element)
は、「このコードは十分に汎用的ではないエラーと、コンパイルされません(静的メソッドを明示的に汎用作られる)コードの複数のC#様バージョンです。型変数 'はスコープをエスケープするため、一般化できませんでした。
相互に再帰的な型を保つことについてのコメントに合意しました。 –