【发布时间】:2019-12-12 21:15:31
【问题描述】:
这个问题不是重复的
A question with the same title already exists,但在我看来,answer 只是部分解决了这个问题,我也对它没有回答的问题感兴趣。
前言
Real World Haskell 在第 3 章第 58 页提出了以下二叉树数据类型的定义,
data Tree a = Node a (Tree a) (Tree a)
| Empty
deriving (Show)
它提供了两个构造函数(用于空和非空Trees)。
另一方面,在第 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 还是Just (Node ...) 构建的,对于整个树(或根节点)来说几乎相同,它确实可以自己定义作为Nothing 或Just (Node ...);也就是说,只有一个构造函数,Nothing 是实例化一棵空树的方法。 (换句话说,我刚刚开始认为这个问题本质上是“格式错误的”。尽管如此,我还是会发布它,因为我认为我可以从您的 cmets/answers 中学到一些东西。)
上面说的有道理吗?
一个可能的答案
原始问题中的评论提出了以下解决方案
data Tree a = Tree (Maybe (a,Tree a,Tree a))
(我的理解)允许通过Node Nothing 实例化一个空树,或者通过Node (Just (value,child1,child2)) 实例化一个非空树。
【问题讨论】:
-
data Tree a = Tree (Maybe (a,Tree a,Tree a))似乎在原始定义中指定Nothing到Empty和Just到Node。它到底有什么好处..?