在SML中int - > int - > int和(int*int) - > int有什么区别?

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)

这两种类型对于同一功能有什么区别?还有为什么同一功能有两种类型?

sep*_*p2k 5

如果我们从你的两个定义中删除语法糖,它们就会成为:

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 -> intint -> (int -> int)描述获取int和返回int -> int函数的函数相同.

*另一方面是用于元组类型的语法,即int * int包含两个整数的元组的类型,因此int * int -> int(括号为(int * int) -> int因为*具有更高的优先级->)描述了一个取两个整数的元组并返回一个int的函数.