2012-12-13 1 views
0

하스켈에서 약간 큰 건물을 만드는 것에 대해 더 알고 싶으면 그래프 라이브러리를 작성하고있다.새로운 하스켈 클래스에서 타이핑하는 것에 약간의 혼란이있다.

기본적으로 Edge을 두 개의 점 집합으로 정의하려고합니다 (from 점과 to 점). 하지만, 여러 유형의 가장자리 (Weighted/not)가 있는데, 이들을 에 섞을 수 있기를 원하지 않습니다.

따라서, 제가 생각하기에 노력한 다형성 행동의 양을 달성하기 위해서는 두 개의 새로운 클래스 인 WeightedEdgy을 작성해야했습니다. Edge의 두 유형 모두 Edgy이되지만 가중치가 Edge 유형 만 Weighted이됩니다.

Weighted 클래스는 전체 개체를 수정하기 만하면되므로 간단합니다.

class Weighted a where 
    modifyWeight :: (Unbounded Int -> Unbounded Int) -> a -> a 

Unbounded 내가 무한히 크고 작은 숫자를 지원하기 위해 함께 던진 민 유형이 :이처럼 보이는 것입니다. 그것은 단지 a을 반환해야하기 때문에 충분히 간단합니다.

내가 붙어있는 것은 Edgy 클래스가 뭔가를 클래스 유형의 유형으로 반환하는 것입니다 (??? 정말 이걸 넣는 방법, 내부 유형, 아마도?).

data Edge a = Edge (Vertex a) (Vertex a) deriving (Show, Eq) 

data WEdge a = WEdge (Vertex a) (Vertex a) (Unbounded Int) deriving (Show, Eq) 
: - 내가 여기 여기 만들기 위해 노력하고있어 Edge 선언 Vertex이 래퍼 클래스는

class Edgy a where 
    to :: a -> Vertex a 
    from :: a -> Vertex a 

: 더 적합 할 수 있습니다, 여기에 내가 함께 일하고 있어요 무슨이 명확하게하려면

그래서 저는 정말로 "당신이 Edgy 클래스의 구성원 인 경우 Edge 유형의 Vertex을 반환 할 수 있어야합니다."라고 말합니다.

그러나 Edgya 유형 대신 aEdge a되는 끝 있기 때문에 GHC이 좋아하지 않는다, 나는 그것의 유형을 꺼내 클래스에 "내려"에 도착하는 방법을 잘 모르겠어요 그것을 반환하기 위해서.

이 내용이 분명하지 않은 경우 의견을 남기십시오.

모든 도움을 주시면 대단히 감사하겠습니다. 나는 곤두박질 친다!

감사합니다.

+2

에서 '그 인스턴스에 대해 가지고있다. 즉, 여기에 타입 클래스가 필요하다는 것을 확신하지 못합니다. 실제로 추가로 복잡성 (ha, ha)이 실제로 발생합니까? –

+0

나는 '엣지'와 '웨이지'를 원한다. 어쩌면 나는 프로그램을 조금 멍청해야 할 것입니다. 여러분은 여분의 복잡성이 불필요하다고 생각할 것입니다. 그래도 조금 더 큰 것을 만드는 것이 어떤 느낌인지 알아 내려고 노력하고 있습니다. 그래서이 길을 택한 뒤에 아이디어를 얻었습니다. –

+1

함수에 'Edge a -> Vertex a'와 같은 유형이 있으면 가장 간단한 것은 n.m.의 대답이 제안하는 것입니다. 'Edgy'가'a' 매개 변수에 대해서 정말로 신경 써야 할 필요가 있다면, 일이 더 까다로울 수 있습니다. 나는 아직도 형판없이 공식화하려고 시도하고 그 모습을 보게 될 것입니다. –

답변

3

당신은 타입 생성자 클래스가 아닌 유형의 클래스를 사용할 수 있습니다

class Edgy e where 
    to :: e a -> Vertex a 
    from :: e a -> Vertex a 

instance Edgy Edge where ... 
당신이 Edgy`을 가지고, 당신은`to`과`어떤 종류의 싶습니다 '기대 인스턴스 말했다 경우 도움이 될
+0

이것은 정확히 내가 찾고 있었던 것, 감사합니다! 그것을 보면 꽤 분명해 보입니다. 그래서 그것은 미래를 염두에 두어야 할 것입니다. –