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 的新手,所以如果这是非常基础的,我提前道歉)
请记住,要构造数据类型的实例,您需要调用其构造函数之一。所有这些构造函数,ND
、Data
、Branch
,都只是常规函数,因此您应该这样调用它们。
在您的 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)
或其他答案中的两层深度。此时方便的构造函数将可以方便地减少噪音和打字。
在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 的新手,所以如果这是非常基础的,我提前道歉)
请记住,要构造数据类型的实例,您需要调用其构造函数之一。所有这些构造函数,ND
、Data
、Branch
,都只是常规函数,因此您应该这样调用它们。
在您的 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)
或其他答案中的两层深度。此时方便的构造函数将可以方便地减少噪音和打字。