Rev*_*mar 1 functional-programming ml sml smlnj
我注意到有两种方法可以在SML中定义函数.例如,如果你使用add函数,这有以下两种方式:
fun add x y = x+y;
fun add(x,y) = x+y;
Run Code Online (Sandbox Code Playgroud)
第一种方法创建函数类型:
val add = fn : int -> int -> int
Run Code Online (Sandbox Code Playgroud)
第二个创建函数类型:
val add = fn : int * int -> int
Run Code Online (Sandbox Code Playgroud)
这两种类型对于同一功能有什么区别?还有为什么同一功能有两种类型?
如果我们从你的两个定义中删除语法糖,它们就会成为:
val add = fn x => fn y => x+y
Run Code Online (Sandbox Code Playgroud)
和
val add = fn xy =>
case xy of
(x,y) => x+y
Run Code Online (Sandbox Code Playgroud)
所以在第一种情况下add是一个函数,它接受一个参数x并返回另一个函数,该函数接受一个参数y然后返回x+y.这种通过返回另一个函数来模拟多个参数的技术称为currying.
在第二种情况下add,函数将元组作为参数,然后添加元组的两个元素.
这也解释了两种不同的类型.->是函数箭头,它与右边相关联,意思int -> int -> int与int -> (int -> int)描述获取int和返回int -> int函数的函数相同.
*另一方面是用于元组类型的语法,即int * int包含两个整数的元组的类型,因此int * int -> int(括号为(int * int) -> int因为*具有更高的优先级->)描述了一个取两个整数的元组并返回一个int的函数.