2009-09-30 5 views
2

(Yes, stillplayingwithunits de measure)unités de Réutiliser mesure par rapport à différents types

Je viens de commencer à utiliser les unités de mesure pour autre chose que flotteur pour la première fois. Après avoir démarré compliqué, j'ai découvert que vous pouvez réutiliser des unités de mesure sur plusieurs 'types'.

[<Measure>] type mm 

let a = 1<mm> 
let b = 1.<mm> 

Maintenant, je suis assis ici se demander comment mettre à jour mon type existant mm pour tenir compte de cette possibilité:

[<Measure>] 
type mm = 
    static member perMetre = 1000.0<mm/m> 
    static member fromMetre (v:float<m>) = v * mm.perMetre 
    static member toMetre (v:float<mm>) = v/mm.perMetre 
    static member lift (v:float) = v * 1.0<mm> 

La question: Comment puis-je écrire une fonction qui peut convertir mm à m (disons) que peut gérer int<mm> -> int<m> ET float<mm> -> float<m>?

MISE À JOUR

Merci à Kurt, voici la nouvelle version:

[<Measure>] 
type mm = 
    static member private perMetreFloat = 1000.0<mm/m> 
    static member private perMetreInt = 1000<mm/m> 
    [<OverloadIDAttribute("float")>] 
    static member fromMetre (v:float<m>) = v * mm.perMetreFloat 
    [<OverloadIDAttribute("float")>] 
    static member toMetre (v:float<mm>) = v/mm.perMetreFloat 
    [<OverloadIDAttribute("float")>] 
    static member lift (v:float) = v * 1.0<mm> 
    [<OverloadIDAttribute("int")>] 
    static member fromMetre (v:int<m>) = v * mm.perMetreInt 
    [<OverloadIDAttribute("int")>] 
    static member toMetre (v:int<mm>) = v/mm.perMetreInt 
    [<OverloadIDAttribute("int")>] 
    static member lift (v:int) = v * 1<mm> 
+0

Quelle est la question? – Brian

Répondre

2

surcharge simplement des œuvres parfois (si vous avez un argument):

[<Measure>] 
type MM = 
    static member perMetre = 1000.0<mm/m> 
    static member fromMetre (v:float<m>) = v * MM.perMetre 
    static member toMetre (v:float<mm>) = v/MM.perMetre 
    [<OverloadIDAttribute("0")>] 
    static member lift (v:float) = v * 1.0<mm> 
    [<OverloadIDAttribute("1")>] 
    static member lift (v:int) = v * 1<mm> 
+0

Lurvely, fonctionne un régal, j'ai inclus le résultat dans le bas de ma question. – Benjol

Questions connexes