2012-03-13 13 views
4

私はいくつかのハスケルコードを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 arrayまたはint [||]の方が混乱は少ないでしょうか?型シグネチャを見ると、それはリストであると思う傾向があります。特に、空のリストも[]として表されるためです。

ここで1つの質問: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#はあなたにもint []を行うことができますタイプの定義で

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

です。どのような構文の砂糖のようなCです。 Yep、T3とT4は同じです。

ただし、これはできません。[]<int>[]は型定義の型配列として動作し、式の中でop_Nilとして動作するので、少し奇妙です。

+2

いくつかの些細なこと:F#のint [] [、]型は、寸法は入れ替えられていますが、C#のint [、] []型と同じです。これは、int list listのようなF#の他の接尾辞型名との一貫性のためです。 – gradbot

+0

また、これは興味深いかもしれません。 http://www.atalasoft.com/cs/blogs/rickm/archive/2009/01/29/f-and-haskell-estranged-cousins.aspx – gradbot