2013-11-02 106 views
1

我最近開始使用F#中的計量單位進行遊戲,並認爲我可以編寫一個非常簡單的示例,計算給定增值稅的總額利率和淨總額。使用F#計量單位從淨額+增值稅金額中計算毛額

例如:

淨額可能等於600.00 增值稅稅率是20% 應該給的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」計量單位不匹配‘net’的」

這好像我需要定義總值類似以下內容:

[<Measure>] type gross = net + vatValue 

但是編譯器不喜歡+

任何想法,我可能會做到這一點?

由於

回答

0

在你的樣品,問題是,你正在嘗試添加不同的單位(有價無增值稅和增值稅值)兩件事情 - 這不是允許使用靜態類型 - 你只能添加同一單元的東西(這是度量單位背後的原則的一部分 - 你可以做的事情不多)。

我認爲最自然的解決方案(但是,並不能給你強有力的安全保證)就是使增值稅率無量綱數。

一般(思考的物理意義時),費率是不具有單位數的例子 - 速度爲X<unit>/Y<unit>一般計算的一些數字X和相同unitY等單位中抵消師。

所以,你可以寫這樣的事情:

[<Measure>] type net 
[<Measure>] type vatRate = 1 
[<Measure>] type vatValue = net * vatRate 

let calculateVat (netValue : float<net>) (vat : float<vatRate>) = netValue * vat 
let calculateGross (netValue : float<net>) (vat : float<vatValue>) = netValue + vat 

這意味着float<vatRate>真的會只是普通floatvatValue相同net(但你仍然可以使用別名,在你的代碼的文檔)。

因此,這消除價(含稅)和價格之間的區別沒有增值稅,但至少你的程序還是靜態浮動區分代表金錢和漂浮代表只是數字。

+0

的vatRate = 1作品很好。 有什麼辦法有calculateGross方法返回一個float類型的? –

+0

如果您使用'vatRate = 1',那麼度量單位類型系統無法區分類型爲'float '和'float '的值 - 因爲它們意味着相同的事情。您應該能夠添加註釋':浮動'但實際上 - 它只是一個跟蹤或_NUMBER_一個_rate_和一些意思_money_之間的差異。 –

1

只有運營商*/,和^在測量被支持的表達式—雖然-可以用於構建負指數。從邏輯上講,這是有道理的,因爲爲了使用尺寸分析,編譯器必須考慮每個因素由標量和單個單位或單位產品組成。

說實話,這似乎不是一個很好的使用單位的措施。它看起來只會讓你的代碼複雜化,而不會提供太多的表現力。

延伸閱讀

1

我知道你沒有問但這是太大了點失之交臂,這是太投入評論。我想可能是你不想要的度量單位的總量,vatRate等,因爲我預計毛重,淨重等是在貨幣方面。

更多的東西像這樣(假設增值稅是歐洲貨幣的百分比):

[<Measure>] type euro 

[<Measure>] type percent 

let gross = 100.0<euro> 
let vatRate = 5.0<percent> 

我的意思是說,我想你已經得到了錯誤的方式來使用計量單位舉行。格羅斯不是一個計量單位 - 這是一個數字;同樣vatRate。

+2

這是有道理的。 我想我一直試圖使用度量單位作爲一種方式來製作一切它自己特定的類型,所以你不會意外地使用一個淨值作爲一個總值,你和pswg指出的是一點點濫用。 我已經轉向使這些類型成爲歧視聯盟,而不是 類型總計= |淨浮法 |浮動毛額 這絕對有效。 感謝您的迴應。我有很多東西要學,所以這樣的評論真的很有幫助 –