SML类型 - >类型 - >类型

时间:2015-04-01 21:12:43

标签: sml

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

我有

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

2 个答案:

答案 0 :(得分: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 = ...定义了一个所谓的curried函数,它是一个接受参数x的函数,然后返回另一个函数,该函数接受参数y然后返回结果。它是fun f x = fn y => ...的语法快捷方式。然后可以将该函数调用为f x yg y,其中g之前已设置为f x

答案 1 :(得分:0)

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