【问题标题】:Standard ML: Lookup Function in Binary Search Tree标准 ML:二叉搜索树中的查找函数
【发布时间】:2015-10-19 03:38:51
【问题描述】:

我正在学习 Ullman 的 Elements of ML Programming。他在 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 给我的类型,它看起来不是咖喱。知道这里发生了什么吗?

感谢您的帮助, 布莱曼

【问题讨论】:

    标签: functional-programming sml currying


    【解决方案1】:

    val lookup = fn : ('a * 'a -> bool) -> 'a btree -> 'a -> bool 类型告诉我们它接受('a * 'a -> bool) 类型的参数并返回'a btree -> 'a -> bool 类型的函数。然后这个函数接受'a tree 类型的东西并返回'a -> bool 类型的函数,然后它接受'a 类型的参数并返回bool。所以是的,lookup 函数是柯里化的。然而,第一个参数(也是一个函数)不是柯里化的,因为它接受两个参数,包装成一对。一般来说,您可以采用柯里化函数(即接受参数并返回函数的函数)并通过以下方式将其转换为非柯里化函数:

    假设你有以下功能

    fun f e1 e2 e3 ... = e
    

    类型

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

    我们可以通过将所有输入包装在一个元组中来取消此函数,例如

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

    然后会有类型

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-03
      • 1970-01-01
      • 2011-12-20
      • 1970-01-01
      • 2017-08-07
      • 1970-01-01
      • 2021-07-23
      相关资源
      最近更新 更多