真实世界Haskell第3章练习:具有1个值构造函数的二叉树

时间:2011-07-07 16:24:56

标签: haskell

第3章定义了以下表示二叉树的递归类型:

data Tree a = Node a (Tree a) (Tree a)
            | Empty
              deriving (Show)

练习要求我使用单个值构造函数实现相同的类型,使用“Maybe”类型来引用子节点:

(摘自第3章第3章练习2)

“定义只有一个构造函数的树类型,就像我们的Java示例。而不是Empty构造函数,使用Maybe类型来引用节点的子节点。”

我想出的解决方案如下:

data AltTree a = AltNode a (Maybe (AltTree a)) (Maybe (AltTree a))
                 deriving (Show)

但是,这不允许包含其他空树的树,例如:

AltNode 1 (AltNode 2 Nothing Nothing) (AltNode 3 Nothing Nothing)

而且我不确定为什么,“Nothing”不是“Maybe”类型的值构造函数?

1 个答案:

答案 0 :(得分:6)

导致错误的Nothing值构造函数不是。传递给顶级树的两个分支应该具有类型Maybe (AltTree a),但(AltNode 2 Nothing Nothing)(AltNode 3 Nothing Nothing)都具有类型AltTree Int。您必须使用Just值构造函数从中创建Maybe类型的值。像

AltNode 1 (Just (AltNode 2 Nothing Nothing)) (Just (AltNode 3 Nothing Nothing))