2012-11-26 24 views
1

因此,我嘗試過以各種方式解決這個問題,但我無法完成這項工作。在F#中創建一個浮點數測量單位的列表。

有什麼辦法可以創建一個包含不同測量單位值的列表(全部基於浮點數)嗎?例如:

let myList = [0.07<ms>; 0.9; 7.2<mm>;] 

因爲它們被視爲不同的類型,所以不能將它們放在同一個列表中。我試圖宣佈列表爲let myList : float<_> list = ...,並給無量綱的數字一個度量單位,但我仍然得到了一個打字錯誤:期待浮動<'U>但浮動。

我無法使用元組/元素,因爲我不知道將在列表中的值的數量。

我是F#的新手,花了不少時間在文檔和網頁上搜索存儲,但還沒有找到解決方案。如果任何人都能指出我正確的方向,我會非常感激。謝謝!

+5

你能給出這樣做的動機嗎?編譯器迫使你做一件好事。 – pad

+0

我想使用列表作爲函數的參數,其中值的使用方式稍有不同,具體取決於使用哪個對象(由派生類創建,全部來自同一個抽象類)。 爲什麼迫使我做一件好事?我不明白! – RachelB

+3

計量單位實際上是爲了這個原因而發明的:防止你意外混合'秒'和'米'。應該處理這些值的函數也將推斷正確的參數類型。請分享一些使用代碼,以便我們瞭解您計劃如何使用它。 – bytebuster

回答

4

我想你需要給出一個更長的例子來說明你想如何使用這個列表。否則很難給出一個好的答案,因爲它取決於使用。

如果你只是想創建一個代表不同的事情號碼列表,那麼你可以考慮使用區分聯合來區分它們:

type Numeric = 
    | Length of float<mm> 
    | Time of float<ms> 
    | Unitless of float 

let myList = [ Time 0.07<ms>; Unitless 0.9; Length 7.2<mm>;] 

然後你就可以創建一個包含不同數量的列表(具有不同的物理意義)。在迭代列表時,您需要使用模式匹配來提取值。

或者,您可以在創建列表時刪除所有單位,但這樣就會失去度量單位提供的保證(這意味着當您從列表中獲得某些值時,您將不知道它具有哪個單位,您可以錯誤地解釋):

let myList = [ float 0.07<ms>; 0.9; float 7.2<mm>;] 

您也可以使用an F# library that lets you track units at runtime

+0

謝謝,這真的很有幫助! 我不敢相信我沒有想過嘗試受歧視的工會,這似乎對我想做的事情很有效......據我目前可以判斷! 我仍然處於調查階段,所以我沒有太多的代碼可以展示,而且我在這個階段沒有什麼意義,我很抱歉,並且非常感謝您嘗試提供幫助。 :) 謝謝你的鏈接,我隱約閱讀了一些與此有關的事情,我還沒有遇到過這個帖子。 – RachelB

相關問題