Mam klasę ogólną w języku F # z jednym parametrem typu i chciałbym utworzyć klasę statyczną zawierającą metody fabryczne. Kiedy piszę moje klasy, kompilator F # generuje błąd związany ze "zmienną typu uciekającą z jej zasięgu". Moje pytanie brzmi: dlaczego istnieje błąd i jak go naprawić.Zakres zmiennoprzepustów typu przy łączeniu ogólnej i nietypowej klasy
Utworzyłem fragment minimalnej wielkości wykazujące problem:
type Foo<'a>(element : 'a) =
member this.Copy() = Bar.Create(element)
and Bar =
static member Create(element : 'a) = new Foo<'a>(element)
Wzajemne rekurencji w rodzajach tam jest, bo chciałbym typ Foo<'a>
aby móc wywołać metody fabryka w klasa statyczna. Powyższy fragment nie jest kompilowany, a błąd jest następujący: "Wnioskowanie typów spowodowało, że zmienna typu a wymknie się jej zakresowi. Rozważ dodanie jawnej deklaracji parametru typu lub dostosowanie kodu, aby było mniej ogólne." Błąd jest rejestrowany jako znajdujący się w metodzie Create
klasy Bar
. Niestety, tak naprawdę nie rozumiem problemu ani go naprawić. Jakieś pomysły?
Oto dodatkowa obserwacja. Skrótowa kompilacja zostaje skompilowana. Wydaje się więc, że problem związany jest z wnioskiem o typ, dokonanym na podstawie metody Copy()
klasy Foo<'a>
. Ponadto fragment
type Foo<'a>(element : 'a) =
member this.Copy() = Bar.Create(element)
and Bar =
static member Create<'a>(element) = new Foo<'a>(element)
jest bardziej C# -jak wersji kodu (gdzie metoda statyczna wyraźnie jest wykonany ogólne), które również nie kompiluje, z błędem „Ten kod nie jest wystarczająco rodzajowy. zmienna typu "a nie może zostać uogólniona, ponieważ wymknie się jej zakresowi."
Uzgodniono, że nie można dopuścić do tego, aby wzajemnie rekurencyjne typy były trzymane w napięciu. –