2011-02-04 2 views
1

는 다음과 같이 정의 쿼드 트리을 상상해 :Quadtrees에 기록 할 패턴 일치가 너무 많습니까?

data (Eq a, Show a) => QT a = C a | Q (QT a) (QT a) (QT a) (QT a) 
    deriving (Eq, Show) 

bad1 = Q u u u u where u = C 255 
bad2 = Q (C 0) (C 255) (Q u u u u) (C 64) where u = C 255 

생성자는 그렇지 잘 형성 쿼드 트리를 만들 수 있습니다. bad1은 단순히 C 255이어야하며 같은 이유의 오른쪽 하단 쿼드 트리가 (이 Q (C 0) (C 255) (C 244) (C 64)해야 너무 때문에 bad2가 유효하지 않습니다.

체크

지금까지 너무 좋아. 그 잘 formness를 확인하는 것은 단순히 문제의 . 모든 내부 쿼드 트리가 이 때 내부 쿼드 트리 반복적으로 기본 케이스는 모든 색상이 모두 동일해서는 안된다,이다

wellformed :: (Eq a, Show a) => QT a -> Bool 
wellformed (Q (C c1) (C c2) (C c3) (C c4)) = any (/= c1) [c2, c3, c4] 
wellformed (Q (C c1) (C c2) se (C c4))  = valid se 
-- continue defining patters to match e.g Q C C C, C Q Q C, and so on... 

질문 :. 나는 모든 possi에 대한 모든 경기를 입력 방지 할 수 있습니다 leafs와 quadtrees의 표식 조합?

나의 질문은 매우 이상한 경우 환자 수 있지만 내 두 번째 날 - 하스켈 - 원활한-learing 제발!

+0

는 관심있는 내용에 따라, 당신은 단지 모든 네 가지 요소가 동일하고 하나의 요소로 만들어 버리는 "나쁜"사건을 감지하는'unify' 기능을 만들 수 있습니다. –

+0

@ 단 : 이미 해냈습니다. 나는 "살균"라고 당신이 언급 한 바와 같이 동일 않습니다 : P – gremo

+0

또한 모듈 외부에서'Q' 생성자를 숨기고, 확실히 모든 것이 잘 형성되어 있는지 확인하기 위해 스마트 생성자를 사용할 수 있습니다. – rampion

답변

4

신경 끄시 고 ...

wellformed :: (Eq a, Show a) => QT a -> Bool 
wellformed (C _) = True 
wellformed (Q (C c1) (C c2) (C c3) (C c4)) = any (/= c1) [c2, c3, c4] 
wellformed (Q nw ne se sw) = wellformed nw && wellformed ne 
    && wellformed se && wellformed sw 

편집 : 더 나은 나 :

wellformed :: (Eq a, Show a) => QT a -> Bool 
wellformed (C _) = True 
wellformed (Q (C c1) (C c2) (C c3) (C c4)) = any (/= c1) [c2, c3, c4] 
wellformed (Q nw ne se sw) = all wellformed [nw, ne, se, sw] 

편집 : 바인딩이 있습니다 잘못,해야한다 : NW NE SW SE !!!

+4

'모든 wellformed [NW NE 자체 SW]'더 짧고 직관적 인 것 :-) –

+0

@Yasir Arsanukaev : 감사합니다, 훨씬 더 우아! – gremo

+0

는 사실은 목록 요소 사이','넣어 잊어 버렸습니다. : -/ –