2011-09-20 8 views
1
여기

의 모호한 선두로부터 코드입니다 : 기본 설정으로 "t 쇼"의 "쇼"를 사용하고 주어진 정의와 트리 데이터와 "쇼"를 사용하는 방법클래스 인스턴스 및 하스켈

data Tree t = NilT 
      | Node t (Tree t) (Tree t) 

instance Show (Tree t) where 
    show NilT = "" 
    show Node t l r = (show t) ++ ", " ++ (show l) ++ ", " ++ (show r) 

나 혼자서?

+0

숙제에 문제가 있습니까? 그것은 의심스러운 최근의 질문과 유사 http://stackoverflow.com/questions/7478878/show-function-for-polymorphic-type 및 http://stackoverflow.com/questions/7479252/how-to-define-that- a-generic-type-is-printable – ivanm

답변

4

show t을 사용하려면 Show t 제약 조건을 인스턴스 정의에 추가해야합니다.

instance Show t => Show (Tree t) where 
    show NilT = "" 
    show (Node t l r) = show t ++ ", " ++ show l ++ ", " ++ show r 

당신은 또한 당신의 패턴 Node t l r 주위에 괄호가 누락되었고, 기능의 응용 프로그램이 이미 가장 높은 우선 순위를 가지고 있기 때문에 그들이 중복 있었다 나는이 show에 호출 주위에 괄호를 제거했습니다.

+0

대단히 감사합니다! –

+0

당신은 (다른 것들 중에서) 당신을 위해 괄호를 고정시키는 것들을하는'hlint'를보고 싶을지도 모릅니다. – MatrixFrog

1

단지 참고 사항 : 목록 요소간에 값을 넣기위한 함수는 Data.List.intersperse입니다.

show (Node t l r) = concat $ intersperse ", " [show t, show l, show r] 

이하

, HAMMAR는 지적 : 목록 요소는 고유 한 유형이 필요로
show (Node t l r) = intercalate ", " [show t, show l, show r] 

불행하게도 당신이 map show [t, l, r]을 쓸 수 없습니다.

+2

또한 결과를 연결하는'Data.List.intercalate'도 있습니다. – hammar

+0

오, 덕분에, 나는'Text'와'ByteString'을 보았을 때 이미 궁금해했습니다. – Landei