Czy typy nieskończone (aka typy rekurencyjne) nie są możliwe w F #?
Rozmawiałem zSadek Drobi na twitterze, gdy pojawi się informacja, że F # nie obsługuje typów nieskończonych. Okazuje się, że w języku C # możesz zrobić coś w ten sposób:
delegate RecDelegate<T> RecDelegate<T>(T x);
Jednak po kilku eksperymentach na obu naszych częściach ustaliliśmy, że to samo w F # wydaje się niemożliwe zarówno w sposób ukryty, jak i jawny.
Wyraźny:
type 'a specialF = 'a->specialF<'a>
błąd FS0191: Ta definicja typu obejmuje natychmiastowe cykliczne odniesienie poprzez skrót, pole struktury lub relację dziedziczenia.
Domniemany:
let rec specialF (x: 'a) = specialF
Niezgodność typu. Oczekiwano a 'b, ale podano „a ->” b. Wynikowy typ byłby nieskończony przy jednoczeniu '' b 'i' 'a ->' b '.
Oczywiście są to celowo proste próbki.
Zastanawiałem się, czy w jakiś sposób się mylę. Może brakowało mi jakiegoś rodzaju adnotacji?