26Fermer28
BookeldOrLe 26/01/2006 à 11:06
le principe de sous-typage n'existe pas en ocaml, (et il serait difficilement implémentable, car c'est un peu le meme principe de typage que la surcharge qui change pas mal le système de types, et qui a déja regardé au moins une fois le typeur d'ocaml a très vite compris qu'on ne peut rien y ajouter sans tout casser...)
attention, ça pourrait etre faisable avec un peu d'effort...

ensuite, pourquoi caml ne remplace pas statiquement:
ok, dans ce cas ce n'est pas du sous typage, c'est de la macro-génération, tu peux faire ça facilement avec un préprocesseur comme camlp4

par exemple:

type num = Intnum of int | Floatnum of float;;

let numplus a b =
match a with
Intnum x -> (
match b with
Intnum y ->
Intnum ( x + y)
| Floatnum y ->
Floatnum ( (float_of_int x) +. y)
)
| Floatnum x -> (
match b with
Intnum y ->
Floatnum ( x +. (float_of_int y))
| Floatnum y ->
Floatnum ( x +. y)
)

etc...
et puis tu remplaces tous les int et floats par des num avec le constructeur approprié, tu remplaces les opérateurs par ceux ci, et quand tu les utilise dans des fonctions typées pour les types de base, tu elimine la disjonction par un match avec conversion si c'est le mauvais type, ...

avec ça tu peux meme faire de la surcharge version sucre syntaxique en réécrivant des fonctions, ex:

let print n =
match n with
Intnum x -> Pervasives.print_int x
| Floatnum x -> Pervasives.print_float x

donc ben si t'as vraiment envie de ça, ben t'as qu'à réécrire ça pour tous les types et en englobant la lib standard ocaml happy