2016-06-29 3 views
2

이 아이디어는 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 ShowShow의 인스턴스가되도록 Concrete과 비슷한 것을 만들 수 있습니까?

+0

'콘크리트'는 * 유형 생성자 *이고 '표시'는 * 유형 클래스 *이기 때문에 '콘크리트보기'라는 표현은 합법적이지 않으며 훨씬 더 적은 인스턴스입니다. 나는 틀릴 수도 있지만,이 일을하지 않을 것이라고 제안 할 것입니다. – MathematicalOrchid

+0

@MathematicalOrchid 이미 ConstraintKinds 및 FlexibleInstances와 함께 작동했습니다. 나는이 질문에 덧붙였다. – afuous

+1

@MathematicalOrchid 이제 kinding 시스템이'Show :: * -> Constraint'를 허용하고, 위에서 한 것처럼 종류를 매개 변수화 할 수 있습니다. – chi

답변

6

불가능합니다. 이것을 고려하십시오 :

instance Monoid (Concrete Monoid) where 
    mappend (Concrete x) (Concrete y) = Concrete (mappend x y) -- type error! 

xy 두 개의 서로 다른 존재 정량화에서 온 이후 유형 오류입니다. xy을 함께 추가 할 수 있다고 보장 할 수 없습니다.

즉, [Concrete [1,2], Concrete ["hello"]][Concrete Monoid] 유형을 갖지만 합계 할 수 없습니다 (mconcat).


이 OOP에, 정확하게에 대해 동일한 문제가, 다음과 같은 기본 클래스/인터페이스가 작동하지 않습니다

interface Vector { 
    Vector scale(double x); 
    Vector add(Vector v); 
} 
class Vec2D implements Vector { ... } 
class Vec3D implements Vector { ... } 

인터페이스는 2 차원 벡터가 다른 벡터에 추가 가능한 것을 의미한다, 3D를 포함하여, 어떤 의미가 없습니다. OOP 솔루션의 경우 F-bounded quantification 및 관련 대중화 curiously recurring template pattern을 참조하십시오.

하스켈에서는 유형 지정이 없으므로 그런 기술이 필요하지 않으므로 Vector 유형 클래스는 이미 혼합 할 수 없습니다.

class Vector a where 
    scale :: Double -> a -> a 
    add :: a -> a -> a 
instance Vector (Vec2D) where ... 
instance Vector (Vec3D) where ... 
+3

그래서 Java에서는 'Thing implements Comparable'뿐만 아니라 'Thing implements Comparable '이됩니다.이것은 좋은 대답입니다. – afuous

+0

@afuous 예, 정확하게. – chi

관련 문제