2015-01-29 3 views
5

이것은 아마도 매우 기본적인 질문 일 뿐이지 만 그럼에도 불구하고 SO에서 다루지 않은 것 같습니다.하스켈 - (타입 선언) "a"란 무엇입니까?

는 최근 하스켈을했고 지금까지 선언 구성 입력 주로 다음

Int 
Bool 
Float 
etc, etc 

가 지금은 목록에 무엇입니까 내가 그런 다음 함수와 같이 a를 사용하는 유형 선언을보고 있어요 그 연관 목록을 반복 :

contains :: Int -> [(Int,a)] -> [a] 
contains x list = [values | (key,values)<-list, x==key] 

사람이 a가 무엇인지에 관한 설명을 제공하고, 어떻게 작동 할 수 있습니까? 관측에서 그것은 모든 유형을 나타내는 것으로 보인다. 이것은 어떤 유형의 목록이라도 매개 변수로 입력 할 수 있다는 것을 의미합니까?

답변

12

예, 그렇습니다. "모든 유형"을 나타냅니다. 지정된 유형 서명의 모든 a이 동일한 유형으로 해결되어야한다는 제한이 있습니다. 따라서 모든 유형의 목록을 입력 할 수 있지만 contains을 사용하여 목록에서 값을 조회 할 때 조회하는 값은 목록의 요소와 동일한 유형이어야합니다. 이는 당연한 것입니다.

+8

마찬가지로 '중요'도 특별하지 않습니다. * 소문자 식별자는 그 의미를 나타냅니다. 이것은 유형 * 변수 *이며, 동일한 서명에 여러 다른 유형 변수가있을 수 있습니다. 예를 들어,'const :: a -> b -> a'는 두 개의 인자를 가지며, 각각의 타입은 첫 번째 입력과 같은 타입의 값을 반환합니다. – amalloy

+2

나는 그것의 아주 일반적인 모양을 본다. 그래서 대부분의 경우'a'는 일반적으로 내 함수가 실제로 사용하거나 변경하지 않는 요소를 나타냅니다. – Bolboa

+1

@ 볼보아 : 예, 다른 언어의 "generics"개념과 밀접한 관련이 있습니다. 그리고 네, 타입이 완전히 범용 인 경우 직접 값 자체에 대해 할 수있는 일은 거의 없습니다. 하스켈은 유형에 대한 더 많은 정보를 제공하는 방법을 가지고있다 (예를 들어, "평등을 비교할 수있다", "인쇄 할 수있다", "숫자처럼 취급 할 수있다"), 값에 대해 더 많은 처리를 할 수있다. ; 이것에 관심이 있다면 문서 나 튜토리얼에서 "클래스"를 찾아보십시오. – psmears

1

하스켈 대문자 소문자 형식 유형 입력 변수가 동안 콘크리트 종류 (Int, Bool) 형 또는 생성자 (Maybe, Either)이다. foralltemplate 철자

C++에서
contains :: forall a. Int -> [(Int, a)] -> [a] 

, :

template<typename a> 
list<a> contains(int, list<pair<int, a>>); 

contains :: Int -> [(Int, a)] -> [a] 

이 *에 대한 속기 : 함수는이 그것을 사용하는 모든 형태 변수에서 암시 적으로 일반적이기 때문에,

Java 및 C#에서는 꺾쇠 괄호로 표기됩니다.

list<a> contains<a>(int, list<pair<int, a>>); 

은 물론, 이러한 언어로, 제네릭 형식의 변수는 종종라고 T, U, V, 하스켈에서 그들은 종종 a, b, c라고하는 동안. 국제 대회의 차이점입니다.

*이 구문은 GHC의 -XExplicitForAll 플래그 및 다른 확장자로 활성화됩니다.

+0

훨씬 더 유용합니다 :'-XScopedTypeVariables'. 또한 C++ 템플릿은 본질적으로 Haskell/ML/... 유형 변수 또는 Java Generics와는 다소 다른 것 같습니다. – dfeuer