Je pensais que Rob allait répondre, mais comme il ne le fait pas, je
vais faire le F#ista intérim.
Le système d'unité de F# est super chouette, mais il n'est pas
vraiment fait pour pour représenter des simples multiples de la même
unité.
Là où c'est fort on sait toujours dans quelle unité on s'exprime. Si
on regarde l'exemple d'un pseudo langage (non pas que scala est un
pseudo langage, hein):
2.cm + 4.m
On ne sait pas quelle est l'unité de sortie. Ok c'est une distance,
mais exprimée en quoi ? En centimètres ? En mètres ? Il va falloir
décider nous même lors de son utilisation, en fait.
On peut faire un parallèle avec le typage : c'est un peu comme si on
passait des “object” de partout, et qu'on castait à l'usage. Du coup
on peut facilement faire des conneries.
F# force statiquement à répondre à cette question (faut dire c'est un
peu son créneau).
Si on veut passer dans un multiple, il va falloir définir nous même
les conversions, ça donne une syntaxe un peu moche, et verbeuse:
[<Measure>]
type m =
static member to_km(m) = m * 0.0001<km/m>
and [<Measure>] km =
static member to_m(km) = km * 1000.0<m/km>
and [<Measure>] cm =
static member to_m(cm) = cm * 0.001<m/cm>
and [<Measure>] mm =
static member to_m(mm) = mm * 0.0001<m/mm>
Du coup on peut écrire:
let d = mm.to_m(1.0<mm>) + cm.to_m(3.0<cm>) + km.to_m(2.0<km>)
Au moins on sait que d est de type float<m>
F# ne nous laisse pas définir des méthodes d'extensions sur des
unités, du coup c'est dur d'avoir un truc fluent.
Voilà.
Jb
2012/7/4 Yann Schwartz <
abolib...@gmail.com>: