使用二叉树类型

时间:2013-01-06 19:09:39

标签: haskell types tree binary-tree instance

我有这种类型声明,表示二叉树:

data Bst a = Empty | Node (Bst a) a (Bst a)

由于我是Haskell的新手,我无法想象如何使用它。你能告诉我如何初始化它的一些实例吗?

3 个答案:

答案 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)

EmptyNode是Haskell所谓的构造函数。构造函数可以使用两种方式:

  1. 作为构建其类型值的函数;
  2. 作为特殊模式匹配语法中的模式,用于分析和反汇编其类型的值。
  3. 如果我们将您的类型加载到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