我有这种类型声明,表示二叉树:
data Bst a = Empty | Node (Bst a) a (Bst a)
由于我是Haskell的新手,我无法想象如何使用它。你能告诉我如何初始化它的一些实例吗?
答案 0 :(得分:3)
Single Int节点:
2
Node Empty (2::Int) Empty
树:
2
/ \
1 3
Node (Node Empty 1 Empty) 2 (Node Empty 3 Empty) :: Bst Int
2
/ \
1 3
\
5
Node (Node Empty 1 Empty) 2 (Node Empty 3 (Node Empty 5 Empty)) :: Bst Int
答案 1 :(得分:2)
您的数据声明声明有两种方法可以构建Bst:使用Empty
构造函数或使用Node
构造函数。
-- An empty Bst
bst1 = Empty
-- A Bst containing a single value.
bst2 = Node Empty 42 Empty
-- A Bst containing 3 values, 2 at the root, 1 in the left child and 3 in the right child.
bst3 = Node (Node Empty 1 Empty) 2 (Node Empty 3 Empty)
答案 2 :(得分:0)
我会略微重写你的声明,使用Node
的更惯用的参数顺序:
data Bst a = Empty | Node a (Bst a) (Bst a)
Empty
和Node
是Haskell所谓的构造函数。构造函数可以使用两种方式:
如果我们将您的类型加载到ghci
解释器中,我们可以使用ghci的:t
命令来显示构造函数的类型:
Ok, modules loaded: Main.
*Main> :t Empty
Empty :: Bst a
*Main> :t Node
Node :: a -> Bst a -> Bst a -> Bst a
*Main>
所以Empty
是一个常量,Bst a
类型a
,而Node
是一个产生Bst a
给定三个参数的函数: a
和两个Bst a
。因此,要构造类型的值,可以使用其中一个构造函数,为其提供所需数量的参数(Empty
为无,Node
为3),且类型正确。
让我再次强调这一点:您可以使用构造函数,就像使用与构造函数相同类型的任何表达式一样。因此,例如,就像您可以在Haskell中部分应用函数(将其应用于少于参数的参数),您可以部分应用构造函数:Node "foo" Empty
具有类型Bst String -> Bst String
。