如何在Haskell中实现BST搜索

use*_*256 1 haskell

我正在尝试理解这段代码:

search_bst :: Tree -> String -> Maybe Int 
search_bst Leaf _ = Nothing
search_bst (Node k v l r) sk =
    if sk == k then Just v
    else if sk < k then search_bst l sk
    else search_bst r sk
Run Code Online (Sandbox Code Playgroud)

我可以得到这个概念但是Node k v l r意味着什么?这是否意味着search_bst需要两个参数,第一个是类型的实例Node并且有三个值?

ben*_*ofs 5

Haskell语言的这个特性称为模式匹配.签名Tree -> String -> Maybe Int告诉您search_bst函数的第一个参数是类型Tree.该Tree数据类型可能是定义如下:

data Tree = Leaf | Node String Int Tree Tree
Run Code Online (Sandbox Code Playgroud)

A Tree是a Leaf或a Node.甲Node还包含类型的4个字段String,Int.TreeTree.模式匹配现在允许您访问这些字段并拆分类型值Tree.在你的函数中,第一种情况:

search_bst Leaf _ = Nothing
Run Code Online (Sandbox Code Playgroud)

意思是:如果search_bst给出Leaf第一个参数,任何东西作为第二个参数,则返回Nothing.

第二种情况:

search_bst (Node k v l r) sk =
  if sk == k then Just v
  else if sk < k then search_bst l sk
  else search_bst r sk
Run Code Online (Sandbox Code Playgroud)

则表示:如果type的第一个参数Tree是a Node,则变量k,v,l和r将是Node构造函数的字段值.变量sk引用函数的第二个参数.

因此,如果你跑search_bst (Node "foo" 3 Leaf Leaf) "foo",那么首先,将尝试第一种情况.因为表达式Node "foo" 3 Leaf Leaf是a Node而不是a Leaf,所以第一种情况将失败.现在将尝试第二种情况,并且它匹配.所以k设置为"foo",v设置为3,lto Leaf,r也设置为Leaf.然后评估函数体.

您可以在本书的一中学习更多关于函数定义的语法.了解大好的Haskell!