Я недавно начал играть с единицами измерения в F # и думал, что могу написать очень простой пример, который вычисляет валовую сумму с учетом НДС и общий итог.Использование единиц измерения F # для вычисления валовой суммы с чистой суммы + сумма НДС
Например:
Чистая сумма может быть равна 600.00 ставка НДС будет 20% Какой должна дать Gross сумму 720.00
У меня есть следующие типы
[<Measure>] type net
[<Measure>] type vatRate
[<Measure>] type vatValue = net * vatRate
[<Measure>] type gross
И следующие функции
let calculateVat (netValue : float<net>) (vat : float<vatRate>) = netValue * vat
let calculateGross (netValue : float<net>) (vat : float<vatValue>) = netValue + vat
С помощью следующих тестов:
let calcVatTest = calculateVat 600.00<net> 0.2<vatRate> = 120.00<vatValue>
let calcGrossTest = calculateGross 600.00<net> 120.00<vatValue> = 720.00<gross>
Проблема у меня в том, что я не могу получить правильный синтаксис для функции calculateGross, и я получаю ошибку компиляции: «Единица измерения" vatValue»не соответствует единица измерения" чистой»
кажется, что мне нужно определить валовые похожее на следующее:
[<Measure>] type gross = net + vatValue
Но компилятор не нравится +
Любые идеи, как я могу это достичь?
Благодаря
VatRate = 1 работает красиво. Есть ли способ, чтобы метод calculateGross возвращал тип float? –
Если вы используете 'vatRate = 1', тогда система единиц измерения не может различать значения, которые имеют тип' float' и 'float ' - потому что они означают одно и то же. Вы должны иметь возможность добавлять аннотацию ': float ', но на самом деле - она отслеживает разницу между _number_ или _rate_ и числом, означающим _money_. –