【问题标题】:SML type -> type -> typeSML 类型 -> 类型 -> 类型
【发布时间】:2015-04-02 05:28:44
【问题描述】:

我很难理解这一点。问题:

我有

datatype 'a tree= Leaf of 'a | Node of 'a tree * 'a * 'a tree

我必须使用二进制搜索在其中找到值。这是我的代码。

fun binSearch ((Leaf n), x) = if n=x then true else false
  | binSearch ((Node (left, n, right)), x) =
        if n=x then true else
        if n>x then binSearch (left, x) else
        binSearch (right, x)

但我应该用这个签名写函数:

val binSearch : int tree -> int -> bool

我得到了int tree * int -> bool 部分,但我该怎么做'a -> 'b -> 'c

【问题讨论】:

  • 路过评论:if C then true else false 是写C 的复杂方式。 ;) 同样,if C then true else E 只是 C orelse E
  • @AndreasRossberg 所以如果我做对了,1=1 orelse false 返回 true,1=2 orelse false 返回 false。如果我写代码而不是false怎么办?
  • C orelse false 返回的结果与C 相同,所以你不会写那个。 C1 orelse C2if C1 then true else C2 的缩写。同样,C1 andalso C2if C1 then C2 else false 的缩写。与 C 中的 ||&& 相同。

标签: sml


【解决方案1】:

要将a * b -> c 类型的函数转换为a -> b -> c 类型的函数,请将fun f (x, y) = ... 替换为fun f x y = ...

fun f (x, y) = ... 定义了一个函数,它接受一个元组并自动将元组的值解包到变量xy 中。这是fun f tuple = case tuple of (x, y) => ... 的语法捷径。它导致a * b -> c 类型,因为a * b 表示“包含ab 的元组”。然后可以将函数调用为f (x, y)f t,其中t 是一个元组。

fun f x y = ...另一方面定义了一个所谓的柯里化函数,就是一个函数接受参数x然后返回另一个函数,它接受参数y然后返回结果。它是fun f x = fn y => ... 的语法快捷方式。然后可以将函数调用为f x yg y,其中g 之前已设置为f x

【讨论】:

    【解决方案2】:

    签名int tree * int -> bool 表示该函数将一对(int tree, int) 作为输入并输出bool

    签名int tree -> int -> bool等价于int tree -> (int -> bool),表示函数接受int tree并输出签名为int -> bool的函数。

    签名'a * 'b -> 'c是这样获得的:

    fun my_fun (a,b) = some_c
    

    而签名'a -> 'b -> 'c是通过这种方式获得的:

    fun my_fun a = fn b => some_c
    

    也就是说,您必须创建并返回一个 lambda 表达式(动态创建的匿名函数)。

    另外,请记住第一种函数是这样调用的:my_fun(my_tree,my_int),而第二种函数是这样调用的:my_fun my_tree my_int

    【讨论】:

      猜你喜欢
      • 2013-12-31
      • 1970-01-01
      • 1970-01-01
      • 2013-11-17
      • 2012-02-17
      • 2013-01-30
      • 2017-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多