이 아이디어는 Show
의 인스턴스 인 값 목록을 작성하는 것입니다. GADT를 사용하여 콘크리트 Showable
유형을 만드는 다음 스 니펫을 발견했습니다.GADT가있는 유형 클립을위한 구체적인 유형 구성
data Showable where Showable :: Show a => a -> Showable
instance Show Showable where
show (Showable x) = show x
list :: [Showable]
list = [Showable 4, Showable "hello", Showable 'a']
그럼, 어떤 typeclass 콘크리트를 만들 수있는 유형을 만들어 Showable
보다 일반적인 만들기 위해 노력했다.
data Concrete a where Concrete :: a b => b -> Concrete a
instance Show (Concrete Show) where
show (Concrete x) = show x
list :: [Concrete Show]
list = [Concrete 4, Concrete "hello", Concrete 'a']
이것은 ConstraintKinds 및 FlexibleInstances 언어 확장과 함께 작동하지만 다른 typeclasses에 대한 구체적인 유형을 만들기 위해 Concrete
를 사용하기 위해, 각각의 하나는 새로운 인스턴스를 요구한다.
예를 들어 Concrete Show
이 Show
의 인스턴스가되도록 Concrete
과 비슷한 것을 만들 수 있습니까?
'콘크리트'는 * 유형 생성자 *이고 '표시'는 * 유형 클래스 *이기 때문에 '콘크리트보기'라는 표현은 합법적이지 않으며 훨씬 더 적은 인스턴스입니다. 나는 틀릴 수도 있지만,이 일을하지 않을 것이라고 제안 할 것입니다. – MathematicalOrchid
@MathematicalOrchid 이미 ConstraintKinds 및 FlexibleInstances와 함께 작동했습니다. 나는이 질문에 덧붙였다. – afuous
@MathematicalOrchid 이제 kinding 시스템이'Show :: * -> Constraint'를 허용하고, 위에서 한 것처럼 종류를 매개 변수화 할 수 있습니다. – chi