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) = ...
定义了一个函数,它接受一个元组并自动将元组的值解包到变量 x
和 y
中。这是 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 y
或 g y
,其中 g
先前已设置为 f x
。
我很难理解这一点。问题:
我有
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) = ...
定义了一个函数,它接受一个元组并自动将元组的值解包到变量 x
和 y
中。这是 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 y
或 g y
,其中 g
先前已设置为 f x
。