2011-09-20 67 views
1

這裏曖昧發生難度代碼:類實例和哈斯克爾

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) 

如何在「T秀」用「秀」使用默認設置,並使用「秀」與給出的定義的樹數據我自己?

+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] 

可短,哈馬爾指出:

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