Je discutais avec Sadek Drobi sur twitter quand on m'a dit que F # ne semblait pas supporter Infinite Types. Il se trouve que dans C#, vous pouvez faire quelque chose le long de ces lignes:Les types infinis (types récursifs) ne sont-ils pas possibles en F #?
delegate RecDelegate<T> RecDelegate<T>(T x);
Cependant, après quelques essais sur nos deux parties, nous avons déterminé que la même chose dans F # semble impossible à la fois implicite et explicite.
explicite:
type 'a specialF = 'a->specialF<'a>
erreur FS0191: Cette définition de type implique une référence cyclique immédiate par une abréviation, champ struct ou relation d'héritage.
Implicite:
let rec specialF (x: 'a) = specialF
Type mismatch. Attend un 'b mais étant donné un' a -> 'b. Le type résultant serait infini en unifiant '' b '' et '' a -> 'b'.
Bien sûr, ce sont des échantillons intentionnellement simples. Je me demandais si je me trompais d'une façon ou d'une autre. Peut-être ai-je manqué un type d'annotation nécessaire?
Y a-t-il une application pratique ici, ou la question était-elle juste le résultat d'une recherche pour le plaisir? – Brian
Pour autant que je sache, il n'y a pas d'applications pratiques, référentielles et transparentes. Cependant, un exemple serait qu'avec un certain type d'état fermé mutable, cela peut être utile pour des applications répétées. ex: add (1) (2) (3) (4) - où n'importe quel nombre d'applications peut être fait. –
Voici un programme OCaml que j'ai écrit qui utilise cette fonctionnalité pour éviter un niveau d'indirection utilisant des rectangles. http://www.ffconsultancy.com/languages/ray_tracer/code/1/ray.ml –