SML 类型 -> 类型 -> 类型

SML type -> type -> type

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

我有

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

签名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

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

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

要将 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 意味着 "a tuple containing an a and a b"。然后可以将函数调用为 f (x, y)f t,其中 t 是一个元组。

另一方面,

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