我很难理解这一点。问题:
我有
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
答案 0 :(得分:1)
要将a * b -> c
类型的函数转换为a -> b -> c
类型的函数,请将fun f (x, y) = ...
替换为fun f x y = ...
。
fun f (x, y) = ...
定义了一个函数,它接受一个元组并自动将元组的值解包为变量x
和y
。这是fun f tuple = case tuple of (x, y) => ...
的句法捷径。它会导致a * b -> c
类型,因为a * b
表示“包含a
和b
的元组”。然后可以将该函数称为f (x, y)
或f t
,其中t
是元组。
fun f x y = ...
定义了一个所谓的curried函数,它是一个接受参数x
的函数,然后返回另一个函数,该函数接受参数y
然后返回结果。它是fun f x = fn y => ...
的语法快捷方式。然后可以将该函数调用为f x y
或g 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
。