먼저 정의의 일부가 누락되었습니다 (data family
선언 자체).
data family HList (l :: [*])
data instance HList '[] = HNil
newtype instance HList (x ': xs) = HCons1 (x, HList xs)
이
가 호출합니다 (
TypeFamilies
확장에서 사용할 수)를
data family
.
pattern HCons x xs = HCons1 (x, xs)
이것은 양방향 패턴 (PatternSynonyms
확장명으로 사용 가능)입니다.
'[]
및 (x ': xs)
구문은 무엇입니까?
생성자 앞에 '
마크가 표시되면 그 숫자는 promoted type-level counterparts입니다.통 사적 편의를.이 모든 DataKinds
확장을 통해 사용할 수 있습니다 promoted lists and tuples은 단지 여분의 틱이 필요합니다 (그리고 우리는 여전히 식 레벨 단점에 대한 빈 타입 수준의 목록과 ':
에 대한 '[]
를 작성 얻을.
을
?
예, 그것은 HList
이 재현 role을 가지고 있는지 확인하는 것입니다 , HCons1
의 권투를 피하는 이외의 튜플 (대신 두 개의 필드와 데이터 선언)와 newtype
선언을 사용하여 어느 시점이되는 너가 할 수있는 것을 의미한다. 사이의 간격은 HList
s 사이이다. 이것은 단지 대답에 설명하기 위해 조금 너무 복잡하지만, 여기에 우리가 대신 newtype instance
(없이 패턴)의
data instance HList (x ': xs) = HCons x (HList xs)
이있을 때 우리가 원하는 일을하지 않는 경우의 예입니다. Int
, Bool
에 representationally 동일 다음 newtype
의 고려, 각각 ()
newtype MyInt = MyInt Int
newtype MyBool = MyBool Bool
newtype MyUnit = MyUnit()
우리가 포장 또는 자동으로 이러한 유형의 랩을 해제 할 coerce
을 사용할 수 있습니다 리콜. 글쎄, 우리는 같은 일을 할 수 있기를 좋아하지만, 전체 HList
에 대한 것 :
ghci> l = (HCons 3 (HCons True (HCons() HNil))) :: HList '[Int, Bool, ()]
ghci> l' = coerce l :: HList '[MyInt, MyBool, MyUnit]
이것은 newtype instance
변형 작동하지만 때문에 역할을하지 data instance
하나. (즉 here에 대한 자세한.)
기술적
1은, 전체적으로 data family
에 대한 역할이 없다 : 역할이 각 instance
/newtype
다를 수 있습니다 - 여기에 우리는 정말로에 HCons
경우 필요 그것이 표현력이 강해지는 표현이기 때문입니다. Check out this Trac ticket.
'(l :: [*])'은 종류 매개 변수 'l'이 종류'[*]'로 제약을 받습니까? – Textfield
@Textfield 바로 그렇습니다! 가지고있는 형식 매개 변수는 승격 된 형식 목록입니다. 생각 해보니, 컴파일하려면'KindSignatures'도 켜야하고,'Data.Kind'도 가져올 필요가 있습니다 ... GHC가 당신에게 조언하는 것은 무엇이든하십시오. :) – Alec