列表与F#中的[]之间的差异

时间:2012-03-13 01:23:27

标签: collections types f# f#-interactive

我正在将一些Haskell代码移植到F#,但是对于可用的集合及其在F#中的签名有点困惑。我的理解是列表中的元素包含在[]之间,{}之间的序列和[|之间的数组]之间|]。在F#Interactive中,当我用5个int创建每个容器时,我得到以下内容。

// List
> [1..5]
val it : int list = [1; 2; 3; 4; 5]

// Seq
> {1..5}
val it : seq<int> = seq [1; 2; 3; 4; ...]

// Array
> [|1..5|]
val it : int [] = [|1; 2; 3; 4; 5|]

令我困惑的是,数组的类型签名是int []。可以输入int arrayint [||]类型会不那么混乱?看一下类型签名,我倾向于认为它是一个列表,特别是因为空列表也表示为[]。

这里有一个问题:为什么序列类型seq<int>而不是int seq。我假设这可能是语法糖,但可能背后有其他东西。

现在使用集合创建新类型:

type T1 = T1 of int list
type T2 = T2 of int seq // becomes type T2 = T2 of seq<int>
type T3 = T3 of int array
type T4 = T4 of int []

T3和T4是一回事吗?

1 个答案:

答案 0 :(得分:6)

F#允许您使用.Net样式类型定义和ocaml样式类型定义。这些都是一样的。

int list
list<int>  

int seq
seq<int>

int array
array<int>

有些Expressions in F#

[||] is an array
[] is a list
{} is a sequence

在类型定义中,您也可以执行int []。哪个是C语法糖。是的,T3和T4是一样的。

但是你不能这样做[]<int>[]有点奇怪,因为它在类型定义中表现为类型数组,在表达式中表现为op_Nil。