是否可以在F#中定义列表的长度?

时间:2016-01-15 15:25:16

标签: arrays list f#

例如,我将记录定义为:

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

但我已经知道这个列表必须是预定义的大小,比方说2,如果列表不是2,那么它将是一个不同的类型或错误,因为它没有被定义为这样的类型。

是否可以定义列表的大小,就像您必须定义大小的其他语言一样? 根据应用程序,此问题可以应用于数组。

1 个答案:

答案 0 :(得分: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 }