{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
import GHC.Exts (Constraint)
data HList :: [*] -> * where
Nil :: HList '[]
Cons :: a -> HList l -> HList (a ': l)
type family All (p :: * -> Constraint) (xs :: HList [*]) :: Constraint where
All p Nil =()
All p (Cons x xs) = (p x, All p xs)
GHC 그 불평을 :
‘HList’ of kind ‘[*] -> *’ is not promotable
In the kind ‘HList [*]’
왜 난에 HList
은 홍보 할 수 없습니다 종류? GHC 7.8.2
및 7.11
을 사용하여 동일한 오류가 발생합니다. 잘 내장 '[]
작품을 사용 물론
:
type family All (p :: * -> Constraint) (xs :: [*]) :: Constraint where
All p '[] =()
All p (x ': xs) = (p x, All p xs)
내가 사용하려는 내 자신의 HList
대신 '[]
실제 HList
이 추가 지원이처럼 보이기 때문에 :
type family (:++:) (xs :: [*]) (ys :: [*]) where
'[] :++: ys = ys
xs :++: '[] = xs
(x ': xs) :++: ys = x ': (xs :++: ys)
data HList :: [*] -> * where
Nil :: HList '[]
Cons :: a -> HList l -> HList (a ': l)
App :: Hlist a -> HList b -> HList (a :++: b)
EDIT : 주된 목표는 온실 가스를 추정하는 것입니다.
(All p xs, All p ys) ==> All p (xs :++: ys)
내가 형 수준의 목록을 추가하기위한 명시 적 표현을 추가하는 날이 달성 도움이 될 것으로 기대했다
data Dict :: Constraint -> * where
Dict :: c => Dict c
witness :: Dict (All p xs) -> Dict (All p ys) -> Dict (All p (xs :++: ys))
witness Dict Dict = Dict
쓸 수 있도록. 위의 사항을 GHC에 납득시킬 수있는 또 다른 방법이 있습니까?
왜 '모두'가 'HList'에 있어야합니까? 필요할 때마다'HList'의 타입 인자 인'[*]'에'All'을 사용할 수 있습니다. 즉,'frobulate :: All (Frobable xs) => HList xs -> Frob' – Cactus
GHC 유형 시스템 (또는 더 많은 종류의 시스템)이이를 지원하지 않기 때문에 GADT를 홍보 할 수 없습니다.두 번째 HList는 특히 모든리스트가 여러 표현을 가지고 있기 때문에 의미가 없으며 어쨌든': ++ :'에 패턴 일치를 패턴화할 수 없습니다. 나는 당신이 결국'All p (xs : ++ : ys) = 모든 p xs : ++ : 모든 p ys'와 같은 것을 쓰고 싶다고 생각합니다. 그러나 그것은 작동하지 않을 것입니다. 두 번째 HList로 해결하려고하는 실제 문제가 있습니까? – user2407038
HList를 친절하게 홍보해야하는 이유를 이해할 수 없습니다. 왜 []로 할 수 없습니까? ''[]' '을 쉽게 추가 할 수 있습니다. – mb14