标准ML:二进制搜索树中的查找功能

时间:2015-07-28 14:06:52

标签: functional-programming sml currying

我正在通过Ullman的ML编程元素。他在ch中介绍了BST的数据类型。 6如下:

datatype 'label btree = 
    Empty |
    Node of 'label * 'label btree * 'label btree;

然后他定义了一个查找函数来判断BST中是否存在具有给定标签的节点:

fun lookup lt Empty x = false
    | lookup lt (Node(y, left, right)) x =
        if lt(x, y) then lookup lt left x
        else if lt(y, x) then lookup lt right x
        else true;

ML告诉我们该函数的类型为:

val lookup = fn : ('a * 'a -> bool) -> 'a btree -> 'a -> bool

1)我在解析上述内容时遇到问题。我知道" - >"从右边起,但是我很难理解如何做到这一点。你怎么知道如何通过查看上面的内容来做到这一点?

val lookup = fn : ('a * 'a -> bool) -> ('a btree) -> ('a) -> (bool)

2)我很困惑,因为我认为curried函数会创建一系列函数,这些函数会在每个后续参数中返回另一个函数。但根据ML给我的类型,看起来它并非咖喱。知道这里发生了什么吗?

感谢您的帮助, bclayman

1 个答案:

答案 0 :(得分:3)

类型val lookup = fn : ('a * 'a -> bool) -> 'a btree -> 'a -> bool告诉我们它采用类型('a * 'a -> bool)的参数并返回类型为'a btree -> 'a -> bool的函数。然后,此函数接收'a tree类型的某些内容并返回类型为'a -> bool的函数,然后该函数接收类型为'a的参数并返回bool。所以是的,lookup函数是curry。然而,第一个参数(也是一个函数)并不是curry,因为它包含两个参数,包含在一对中。通常,您可以使用curried函数(即接受参数并返回函数的函数)并按以下方式将其转换为未计算函数:

假设您有以下功能

fun f e1 e2 e3 ... = e

类型

'a -> 'b -> 'c -> ... -> 'res

我们可以通过将所有输入包装在元组中来解决此问题,例如

fun f(e1, e2, e3, ...) = e

然后将具有类型

'a * 'b * 'c * ... -> 'res