我正在通过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
答案 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