类实例和Haskell中的模糊发生

时间:2011-09-20 23:47:33

标签: haskell instance ambiguous

以下是代码:

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”和树形数据以及我自己给出的定义?

2 个答案:

答案 0 :(得分: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调用的括号,因为它们是多余的,因为函数应用程序已经具有最高优先级。

答案 1 :(得分: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],因为列表元素需要具有唯一类型。