我需要将以下数据类型作为 Show
的实例:
data Tree a b = Branch b (Tree a b) (Tree a b) | Leaf a
我是一个相对新手,但首先,我解释了这个声明:
"我们创建了一个名为Tree的新类型,它使用类型a和b进行参数化。一棵树可以是两种东西之一:Branch,它保存了类型为b的数据项以及另外两棵树,或者是Leaf,它保存了类型为a的数据项。"
现在,我需要制作一种漂亮的“显示”方式(嵌套分支等),而不使用deriving
。到目前为止,我只在模块Main中编写函数,并在解释器窗口中加载/播放它们,因此我以前实际上并没有使用构造函数等来做事情。尽管如此,我认为我可以从在我的文件中声明树数据类型开始,就像问题开头所示,然后从那里开始。
当我尝试“Show”时,没有太大的成功,我想也许我需要先定义一小部分树以及如何“Show”它,然后再尝试整个树:
data Leaf a = Leaf a
instance Show (Leaf a) where
show (Leaf a) = ???
我在 ??? 处尝试了很多方法,比如 "a",只有 a 自己,putStrLn 等等,但是当我使用类似于以下方式时,都没有打印出 a 的值。
>show (Leaf 3)
实际上,我在很多情况下都遇到过这种情况,这可能意味着我没有正确地定位事物:
Ambiguous occurrence `show'
It could refer to either `Main.show', defined at a2.hs:125:1
or `Prelude.show',
imported from `Prelude' at a2.hs:2:8-11
(and originally defined in `GHC.Show')
我尝试通过调用 "Main.show" 来解决这个问题,但显然不起作用。
我想我的问题是,我该去哪里解决这个问题呢...或者只是简单地说,"我如何修复 Leaf 的“Show”实用程序,以便我可以找出如何扩展它?"(假设我必须先定义它...)