Haskell中的类实例和不明确事件

Haskell中的类实例和不明确事件,haskell,instance,ambiguous,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”?为了使用show t,必须将约束show

代码如下:

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”?

为了使用
show t
,必须将约束
show t
添加到实例定义中

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

您的模式
节点tlr
周围也缺少括号,我删除了
show
调用周围的括号,因为它们是多余的,因为函数应用程序已经具有最高优先级。

为了使用
show t
,必须将约束
Show t
添加到实例定义中

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

您的模式
节点tlr
周围也缺少括号,我删除了
show
调用周围的括号,因为它们是多余的,因为函数应用程序已经具有最高的优先级。

只是一个旁注:有一个函数
Data.List。用于在列表元素之间插入一个值

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]

不幸的是,您无法编写
映射显示[t,l,r]
,因为列表元素需要有一个唯一的类型。

只是一个旁注:有一个函数
Data.list。用于在列表元素之间插入一个值

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]

很遗憾,您无法编写
映射显示[t,l,r]
,因为列表元素需要具有唯一的类型。

这是一个家庭作业问题吗?它看起来与最近的问题很相似,这是一个家庭作业问题吗?它看起来与最近的问题可疑地相似,还有
数据.List.interlate
,它也连接结果。哦,谢谢,我已经在想,因为我在
文本
ByteString
中看到了它。还有
数据.List.interlate
,它也连接结果。哦,谢谢,正如我在
Text
ByteString
中看到的那样,我已经在想了。你可能还想看看
hlint
,它为你做了一些括号固定的事情(除其他外)。你也可能想看看
hlint
它为你做了一些括号固定的事情(除其他外)。