Haskell 定义一棵树

Haskell defining a tree

在haskell我可以做

a :: Int
a = 15

我的数据类型如下

data Btree a = ND | Data a |  Branch (Btree a) (Btree a) deriving (Show, Eq)

如何定义一棵树,而不是像上面那样使用函数。

我试过了;

tree :: BTree
tree = Branch Btree (Branch ND Data 1) (Branch ND (Branch ND ND))

我似乎无法让它工作(我是 haskell 的新手,所以如果这是非常基础的,我提前道歉)

请记住,要构造数据类型的实例,您需要调用其构造函数之一。所有这些构造函数,NDDataBranch,都只是常规函数,因此您应该这样调用它们。

在您的 tree 中,您将数据类型 (Btree) 与构造函数混合在一起,而您应该只使用构造函数。此外,请记住函数调用('space operator' 是左关联的)非常贪婪,因此 Branch ND Data 1 使用 3 个参数调用函数 Branch,而不是你想要的:Branch ND (Data 1).

因此,要根据以上内容创建深度为 2 的树:

tree = Branch (Branch ND (Data 1)) (Branch ND (Branch ND ND))

请注意,Data 1 也将是一个 Btree,没有任何额外的包袱

Prelude> :t (Data 1)
(Data 1) :: Num a => Btree a

如果你想要一个只有正确元素的简单分支,你可以写

Branch ND (Data 1)

或其他答案中的两层深度。此时方便的构造函数将可以方便地减少噪音和打字。