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 show”中的“show”和我自己定义的树数据使用“show”?

4

2 回答 2

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,因为它们是多余的,因为函数应用程序已经具有最高优先级。

于 2011-09-21T00:31:10.273 回答
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],因为列表元素需要有一个唯一的类型。

于 2011-09-21T08:06:15.730 回答