這裏曖昧發生難度代碼:類實例和哈斯克爾
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秀」用「秀」使用默認設置,並使用「秀」與給出的定義的樹數據我自己?
這裏曖昧發生難度代碼:類實例和哈斯克爾
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秀」用「秀」使用默認設置,並使用「秀」與給出的定義的樹數據我自己?
爲了使用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
,因爲它們是多餘的,因爲功能的應用程序已經具有最高優先級。
非常感謝! –
你也可能想看看'hlint',它爲你做了一些括號固定的東西(等等)。 – MatrixFrog
只是旁註:有一個函數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]
,如列表中的元素需要有一個獨特的類型。
這是一個功課題嗎?它看起來可疑類似於最近的問題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