2010-02-09 2 views
3

하스켈에서 트리 데이터 타입을 정의했고 트리의 요소 수를 계산하는 연관된 'size'메소드를 정의했습니다. 나는이 기능을 사용하여 지정된 필드에 액세스 할 수 내가 (GHCi의 장난에 의해) 발견했습니다하스켈 함수에서 명명 된 필드에 접근하기

data Tree a = Empty 
| Leaf {value::a} 
| Node {left :: (Tree a), value :: a, right :: (Tree a)} 
deriving (Eq, Ord, Show) 

이 그러나 나는 다음과 같은 정의에로라는 이름의 필드를 사용하는 트리 데이터 유형을 업데이트 한 전 일 (왼쪽 n). 그러나이 함수를 사용하려고하면 오류가 발생합니다.

size :: Tree a -> Int 
size Empty = 0 
size (Leaf l) = 1 
size (Node n) = size (left n) + 1 + size (right n) 

GHCi는 단순히 "범위 내에 있지 않습니다 : 왼쪽"과 오른쪽에 해당하는 것입니다. 트리 정의는 Tree라는 모듈에 있고 크기 정의는 Main이라는 모듈에 있지만 이름이 지정되지 않은 필드에서는 Tree 데이터 유형의 변수에 액세스 할 때 범위에 문제가 없었습니다.

답변

7

size (Node n) 패턴에 올바른 생성자가 있어야합니다. 코드에서 n은 왼쪽 요소를 추출합니다.

size [email protected](Node {}) = size (left n) + 1 + size (right n) 

아니면 패턴으로 레이블을 추출 할 수 있습니다 : 심지어

size [email protected](Node _ _ _) = size (left n) + 1 + size (right n) 

또는를 :

(당신이 정말로라는 이름의 패턴을 사용하려는 경우)

이 시도

size (Node {left=l, right=r}) = size l + 1 + size r 

또는 단순히 라벨을 무시하십시오.

size (Node l _ r) = size l + 1 + size r 
+0

나는 모든 제안을 시도했지만 '범위에 포함되지 않음'오류가 발생합니다. GHCi에서 '왼쪽'과 '오른쪽'을 사용할 수는 있지만 내 메인 모듈에서는 사용할 수 없습니다. – benwad

+1

모듈에서 이름을 내보내시겠습니까? (그 이름도 기능입니다). 모듈 코드에 "module TreeModule (Tree Node Leaf left right)"와 같은 것이 필요합니다. – 0xfe

+0

감사합니다 - 코드에서 왼쪽, 오른쪽 및 값 선언을 생략했습니다. – benwad