2012-11-09 5 views
9

나는 Higher Kind vs Higher Rank 유형을 이해하는 데 어려움을 겪고있다. 종류는 꽤 간단합니다 (하스켈 문학에 대한 감사). 그리고 유형에 대해 이야기 할 때 계급이 비슷하지만 분명히 그렇지 않다고 생각했습니다. 나는 Wikipedia 기사를 읽지 않았다. 그래서 누군가가 순위 란 무엇인지 설명해 주시겠습니까? 높은 등급이 의미하는 것은 무엇입니까? 높은 순위 다형성? 그게 종류 (있는 경우)에 어떻게 오는가? 스칼라와 하스켈을 비교하는 것도 좋을 것이다.친절 대 vs 계급 이론

답변

11

순위의 개념은 실제로 종류 개념과 관련이 없습니다.

다형성 시스템의 순위는 forall이 유형에 나타날 수있는 위치를 설명합니다. 랭크 -1 타입 시스템에서 forall은 가장 바깥 쪽 레벨에서만 나타날 수 있고, 랭크 -2 타입 시스템에서는 하나의 중첩 레벨에서 나타날 수있다.

예를 들어 forall a. Show a => (a -> String) -> a -> String은 랭크 1 유형이고 forall a. Show a => (forall b. Show b => b -> String) -> a -> String은 랭크 2 유형입니다. 이 두 유형의 차이점은 첫 번째 경우에 함수에 대한 첫 번째 인수는 하나의 표시 가능한 인수를 취해 String을 반환하는 함수가 될 수 있다는 것입니다. 따라서 유형이 Int -> String 인 함수가 유효한 첫 번째 인수 (가상 함수 intToString처럼)이므로 forall a. Show a => a -> String (예 : show) 유형의 함수가됩니다. 두 번째 경우에는 forall a. Show a => a -> String 유형의 함수 만 유효한 인수가됩니다. 즉, show은 괜찮지 만 intToString은 유효하지 않습니다. 결과적으로 다음과 같은 기능은 두 번째 유형의 법적 기능을 수 있지만 것없는 첫 번째 (++는 문자열 연결 나타낼 것으로 예상되는 경우) : 여기에 기능 f이 적용되는

higherRankedFunction(f, x) = f("hello") ++ f(x) ++ f(42) 

주 (잠재적으로) 세 가지 유형의 인수. 따라서 f 함수 인 경우 intToString이 작동하지 않습니다.

하스켈과 스칼라는 모두 순위 -1입니다. 따라서 위의 함수는 기본적으로 해당 언어로 작성할 수 없습니다. 그러나 GHC는 순위 2 다형성을 가능하게하는 언어 확장을 포함하고 임의의 n에 대해 Rank-n 다형성을 가능하게하는 또 다른 언어를 포함합니다.

+0

kind는 유형 변수를 한정하고 kind는 유형 상수를 한정한다고 말할 수는 없습니까? – didierc

+0

@didierc 나는 그게 무슨 뜻인지는 모르겠지만 그렇게 생각하지는 않습니다. 타입 변수와 타입 상수 모두 종류가 있습니다. – sepp2k

+1

더 높은 순위의 유형을 스칼라로 쉽게 인코딩 할 수 있습니다. http://www.cs.ox.ac.uk/jeremy.gibbons/publications/scalagp.pdf, 섹션 7.2를 참조하십시오. –