2016-01-15 67 views
4

例如,我定義了一個紀錄:是否可以在F#中定義列表的長度?

type a = {b : float; c: int list} 

,但我已經知道,這個名單必須是一個預定義的大小的,比方說2,如果列表不是2這將是一個不同類型的或錯誤因爲它沒有被定義爲這種類型。

是否可以像在其他語言中那樣定義列表的大小,您必須定義大小? 根據應用的不同,這個問題可以應用到數組中。

+8

僅僅因爲不同的語言使用同一個名稱的類型並不意味着它們是相同的。現在我正在將Python翻譯成F#,我可以向你保證Python列表與F#列表或C#列表不同。如果您試圖將一種語言從一種語言翻譯成另一種語言,則專注於類型的功能,而不是類型的名稱。你爲什麼不使用元組? –

+1

您可以檢查何時創建對象。 –

+1

您是否需要編譯時類型檢查或運行時類型檢查? –

回答

3

也許你應該使用數組,而不是一個列表,因爲數組是固定長度:

// create an array of length = 2, initialized with zeros. 
let cValues : int[] = Array.create 2 0 
cValues.IsFixedSize // returns true 

編輯:正如其他人所建議的,一個元組也可能是要走的路。對於一對(長度爲2的元組),可以使用fst和snd函數訪問這些值。 對於更長的元組,可以使用如下所示的模式匹配。如果元組太長而無法使這種模式匹配方法成爲現實,那麼您可能需要一個F#元組以外的結構。當然,要考慮的一個主要要求是您是否需要存儲混合類型的值。元組或記錄可以存儲多種類型的混合,而數組或列表存儲單個類型的值。

let fourTuple = (5, 10, 2, 3) 
let _,_,third,_ = fourTuple 
printfn "%d" third // displays "2" 

如果數組或一個元組將不能滿足你的要求,那麼也許你應該使用這樣另一個記錄:

type ListOfC = {c1 : int; c2 : int} 
type a' = {b' : float; c' : ListOfC} 

或者你可以創建一個新類,將滿足您的要求,從下面的腳本開始。當然,這可能不會被認爲是慣用的函數式編程風格。這更像是OOP。

type ListOfTwo(firstInt : int, secondInt : int) = 
    member this.First = firstInt 
    member this.Second = secondInt 

let myListOfTwo = ListOfTwo(4, 5) 
myListOfTwo.First 

type a = {b : float; c : ListOfTwo } 
+2

僅僅因爲元組被覆蓋在評論中並不意味着你不應該在你的答案中包含它。大多數使用此問答的人可能會通過Google搜索來到此處,花一分鐘時間查看問題並接受答案,然後繼續。他們通常會跳過評論。不要把它看作是爲了OP而回答,而是要回到這裏的任何人。看看[Tomas的答案](http://stackoverflow.com/users/33518/tomas-petricek?tab=answers)以獲得高質量的答案。 –

相關問題