2010-11-20 19 views
2

J'ai une méthode, appelée RateOfChange, qui prend deux valeurs séparées d'une seconde et renvoie le résultat.Unités de mesure - méthode de réutilisation avec différentes unités passées en

Pour deux positions, il retourne la vitesse, pour deux vitesses, elle renvoie l'accélération, pour deux valeurs d'énergie, il retourne joules/seconde, etc.

Ceci est physiquement possible, mais les unités de mesure ne laissez pas me faire - la première utilisation de la méthode est contrained à préciser le type:

let RateOfChangeWithTime (value1, value2) = (value2 - value1)/1.0<SI.s> 

let velocity = RateOfChangeWithTime(2.0<SI.m>, 1.0<SI.m>) 
let acceleration = RateOfChangeWithTime(3.0<SI.m/SI.s>, 2.0<SI.m/SI.s>) 

la ligne velocity = provoque la méthode à être contraint à float<SI.m> -> float<SI.m>/float<SI.s>, ce qui bien sûr est correct pour la vitesse, mais la ligne acceleration = ... puis ne parvient pas à compiler car il passe dans un float<SI.m/SI.s> que la méthode ne prévoit pas.

Je voudrais que RateOfChangeWithTime soit invariant par rapport au type transmis, mais retourne simplement une unité de mesure qui a été divisée par secondes.

Cela semble correspondre davantage à des situations réelles, est-ce possible? (Je suis en train de le faire pour un scénario plus complexe - voir ici (http://taumuon-jabuka.blogspot.com/2010/11/f-units-of-measure-with-reactive.html)

Répondre

6
let RateOfChangeWithTime (value1: float<_>, value2: float<_>) = (value2 - value1)/1.0<SI.s> 

let velocity = RateOfChangeWithTime(2.0<SI.m>, 1.0<SI.m>) 
let acceleration = RateOfChangeWithTime(3.0<SI.m/SI.s>, 2.0<SI.m/SI.s>) 
+0

Superbe, merci beaucoup pour la réponse ;-) –