我可以这样定义一个树:
data Tree a = Leaf a | Branch (Tree a) (Tree a)
假设我想提醒自己,第一棵树是左边的树,第二棵树是右边的树。
我试过
data Tree a = Leaf a | Branch (L (Tree a)) (R(Tree a))
失败了。因此,Haskell知道Branch
是一个构造函数,但在L
或R
给出此声明时无法做同样的事情。
我试图帮助:
data L a = L a
deriving (Show)
data R a = R a
deriving (Show)
data Tree a =
Leaf a | Branch (L (Tree a)) (R (Tree a))
deriving (Show)
这样可行,但现在我可以拥有L "whatever"
而不是左分支。似乎我需要提醒自己第一棵树是'左'而第二棵树是'右'。
有没有更好的方法呢?
答案 0 :(得分:4)
听起来你想要一张唱片:
data Tree a = Leaf a | Branch { l :: Tree a, r :: Tree a}
然后你可以有一个
Leaf 3
或
Branch { l=Leaf 4, r=... }