2016-07-21 3 views
2

나는 다음과 같은 코드가있을 때 독립했을 때 작동 실패 오류와 같은 간단한 변수가 아니라는 것을 의미합니다.관련 유형 제품군은

하지만 단순히 다음과 같은 코드를 재구성 할 수 있습니다 :

type family T t1 t2 

class C where 
    ... 

type instance T (X t) (t a b) = a 

instance C (X t) where 
    .... 

을 그리고 모든 것이 지금 잘 작동하는 것 같다.

구문이 조금 복잡하기 때문에 패밀리 정의를 클래스에서 제외 시키거나 클래스 정의를 구문 분석 설탕으로 사용하면 비용을 절감 할 수 있습니다.

+1

'클래스 C'의 매개 변수는 무엇입니까? 그게 중요한 것 같아요. – chi

+0

제 이해는 현재 연관된 타입 패밀리가 구문 당 (syntactic sugar)입니다. 나는 그 (것)들이 추가되어야하는지 진짜로 납득시키지 않았다. – dfeuer

답변

4

type family T t1 t2 
type instance T (X t) (t a b) = a 

는 거의 모든 변수는 클래스 K의 파라미터를 t1,t2 얼마나이

class K t1 t1 where 
    type T t1 t2 
instance K (X t) (t a b) where 
    type T (X t) (t a b) = a 

주처럼 작동합니다. 변수는 두 번 이상 발생할 때 는 사실이이 게시 된 오류 상태로 (즉, 비선형)가 필요합니다 :

• Polymorphic type indexes of associated type ‘T’ 
    (i.e. ones independent of the class type variables) 
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
    must be distinct type variables 

그래서 어느 당신이 당신의 클래스에 모든 유형의 변수를 추가하거나 - 동일로 effect - 클래스 외부에서 타입 패밀리를 이동합니다.


이것은 GHC 8.0에서 컴파일됩니다.

{-# LANGUAGE TypeFamilies, PolyKinds #-} 

data X (t :: k) = X 

class C t1 where 
    type T t1 t2 

instance C (X (t :: * -> * -> *)) where 
    type T (X t) (t a b) = a 
관련 문제