2012-03-13 6 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 [||] 일 때 덜 혼란 스럽습니까? 형식 서명을 보면, 나는 목록이라고 생각하는 경향이있다. 특히 빈 목록도 []로 표현되기 때문에 그렇다.

여기 하나의 질문 : 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 스타일 유형 정의를 사용할 수 있습니다. 이것들은 동일합니다. 일부 Expressions in F#

int list 
list<int> 

int seq 
seq<int> 

int array 
array<int> 

당신은 또한 int []을 할 수있는 유형 정의에서

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

이다. 구문 설탕과 같은 C입니다. 네, 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

관련 문제