2012-03-13 32 views
4

我將一些Haskell代碼移植到F#,但對F#中的可用集合和它們的簽名有點困惑。我的理解是列表中的元素包含在[]之間,{}之間的序列和[|之間的數組之間|]。在F#Interactive中,當我使用5個整數創建每個容器時,我會得到以下結果。F#中的列表和[]中的區別#

// 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同樣的事情:

現在使用集合創建新的類型?

回答

5

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。

+2

有些瑣事:F#中的類型int [] [,]與C#中的類型int [,] []類型相同,但交換了尺寸。這是爲了與F#中的其他後綴類型名稱(如int list list)保持一致。 – gradbot 2012-03-13 02:06:55

+0

你可能也會覺得這很有趣。 http://www.atalasoft.com/cs/blogs/rickm/archive/2009/01/29/f-and-haskell-estranged-cousins.aspx – gradbot 2012-03-13 02:35:34

相關問題