2015-07-15 3 views
0

Я пытаюсь использовать Math.Round в функции округлить денежную сумму следующим образом:Использование Math.Round с Единица измерения

let calculateTaxablePayToDate previousPayToDate taxablePayThisMonth = 
    taxablePayThisMonth 
    |> fun (x:decimal) -> Math.Round(x) 
    |> fun x -> x + previousPayToDate 

Типы, которые я передаю в оба типа decimal<GBP> , Когда я пытаюсь и запустить их через функцию, хотя я получаю:

Это выражение, как ожидается, иметь тип
decimal, но здесь имеет тип
int<GBP>

Как я в состоянии использовать Math.Round на цифра, в которой прилагается Единица измерения?

+0

Пожалуйста, добавьте фрагмент кода, который может быть скомпилирован с примером, как вы называете функцию 'calculateTaxablePayToDate'. В противном случае трудно узнать – Petr

+0

Обратите внимание, что вы можете использовать '(+) previousPayToDate' вместо' fun x -> x + previousPayToDate' – phoog

ответ

3

Math.Round ожидает необработанное значение, а не значение меры. Вы можете обернуть его в функции общего в тип измерения:

open System 
open Microsoft.FSharp.Core.LanguagePrimitives 

let roundMeasure<[<Measure>]'u>(x: decimal<'u>): decimal<'u> = Math.Round(decimal x) |> DecimalWithMeasure 

, то вы должны быть в состоянии сделать:

let calculateTaxablePayToDate previousPayToDate taxablePayThisMonth = 
     taxablePayThisMonth |> roundMeasure |> fun x -> x + previousPayToDate 

или

let calculateTaxablePayToDate previousPayToDate taxablePayThisMonth = 
    previousPayToDate + (roundMeasure taxablePayThisMonth) 
+0

Спасибо @Lee. Какова конечная функция, которая касается roundMeasure pipe to; 'DecimalWithMeasure'? Это не компиляция этой части на данный момент. – Stu1986C

+0

Ничего, я справился. Пришлось открывать 'LanguagePrimitives' :) Спасибо – Stu1986C

+0

Из темы, но я думаю, что конвейеры здесь действительно не помогают. Почему не просто '(roundMeasure taxablePayThisMonth) + предыдущий'? –

Смежные вопросы