这个问题不是重复的
已存在同标题的问题 https://stackoverflow.com/questions/6613871/real-world-haskell-chapter-3-excercise-binary-tree-with-1-value-constructor,但是answer https://stackoverflow.com/a/6614006/5825294在我看来,只部分解决了这个问题,而且我也对它未得到解答的内容感兴趣。
Foreword
现实世界 Haskell 在第 3 章第 58 页中提出了以下二叉树数据类型的定义:
data Tree a = Node a (Tree a) (Tree a)
| Empty
deriving (Show)
它提供了两个构造函数(用于空和非空Tree
s).
另一方面,第 60 页的一个练习挑战读者定义Tree
使用单个构造函数的数据类型。
经过多次尝试,我想出了与上面链接相同的解决方案:
data Tree a = Node a (Maybe (Tree a)) (Maybe (Tree a)) deriving(Show)
链接问题中未回答的内容是什么
这个定义的缺点是它不允许实例化一个空的Tree
,尽管它允许实例化Tree
通过以下语法使用空子项:
Node 3 Nothing (Just (Node 2 Nothing Nothing))
我认为没有比上面更好的解决方案,如果没有“独立”空树是可以接受的,并且要求仅使用一个构造函数。
对上述陈述发表一些评论会很好;然而,我的主要问题是我如何定义Tree
使用一个构造函数,这样我就可以实例化一个空的Tree
?
既然我已经写了这个问题,我认为一个可能的答案如下,但我对此完全不确定:
如果一个孩子是否为空被编码为它是否是通过构造的Nothing
or Just (Node ...)
,几乎同样适用于整个树(或根节点),它确实可以将其本身定义为Nothing
or Just (Node ...)
;这就是说,只有一个构造函数,Nothing
是实例化空树的方法。 (换句话说,我刚刚开始认为这个问题本质上是“格式不正确”的。尽管如此,我还是会发布它,因为我认为我可以从你的评论/答案中学到一些东西。)
以上有道理吗?
一个可能的答案
原始问题中的评论提出了以下解决方案
data Tree a = Tree (Maybe (a,Tree a,Tree a))
(我的理解)允许通过以下方式实例化一棵空树Node Nothing
,或非空树Node (Just (value,child1,child2))
.