Перегрузка показателей F#

Рассмотрим следующий код F#:

[<Measure>] type pixel
[<Measure>] type inch
[<Measure>] type dot
[<Measure>] type percentage

let scaleCalculation (finalSize:float<pixel>) (originalSize:float<pixel>) =
   finalSize/originalSize * 100.0<percentage>

(Я понимаю, что мне нужно проверить originalSize на 0, но на самом деле это не относится к этому вопросу).

Я хотел бы перегрузить эту функцию для обработки дюймов и точек на дюйм. Я не думаю, что есть какой-либо способ перегрузить единицу измерения, но я просто подумал, что посмотрю, есть ли у кого-нибудь какие-либо предложения по этому поводу.

Я знаю, что могу сделать это:

   let scaleCalculation (finalSize:float) (originalSize:float) =
      finalSize/originalSize * 100.0<percentage>

но тогда я теряю проверку меры finalSize и originalSize. Я просто хочу убедиться, что мера finalSize и originalSize одинакова.

Есть предложения, мысли?


person Onorio Catenacci    schedule 14.07.2011    source источник


Ответы (1)


let scaleCalculation (finalSize:float<'u>) (originalSize:float<'u>) =
   finalSize/originalSize * 100.0<percentage>

Единицы измерения в F#: часть четвертая, параметризованные типы

person gradbot    schedule 14.07.2011
comment
Абсолютно отлично. Я подумал, что мне нужно как-то использовать общий код, но я еще не успел опробовать код. Спасибо Градбот. Привет, ты уже есть в Google+? - person Onorio Catenacci; 15.07.2011
comment
И я хотел бы дать вам еще один голос за эту ссылку. :-) - person Onorio Catenacci; 15.07.2011
comment
@Benjol - почему ты изменил этот код? Я имею в виду, насколько я могу судить, вы изменили общий 'a на 'u - я не совсем понимаю, как это улучшает код. Кроме того, если вы собираетесь изменить букву общего параметра, то для меня это будет иметь больше смысла. Смотрю как в Мере. :-) - person Onorio Catenacci; 16.07.2011
comment
@Onorio 'u соответствует стилю, используемому в исходном коде fsharps. Я предполагаю, что это означает единицу измерения. - person gradbot; 17.07.2011