Functional programming int->;之间的区别是什么;int->;int和(int*int)——>;SML中的int?

Functional programming int->;之间的区别是什么;int->;int和(int*int)——>;SML中的int?,functional-programming,sml,smlnj,ml,Functional Programming,Sml,Smlnj,Ml,我注意到在SML中有两种定义函数的方法。例如,如果使用add函数,则有两种方法: fun add x y = x+y; fun add(x,y) = x+y; 第一种方法创建函数类型,如下所示: val add = fn : int -> int -> int val add = fn : int * int -> int 第二个函数创建函数类型为: val add = fn : int -> int -> int val add = fn : int *

我注意到在SML中有两种定义函数的方法。例如,如果使用add函数,则有两种方法:

fun add x y = x+y;

fun add(x,y) = x+y;
第一种方法创建函数类型,如下所示:

val add = fn : int -> int -> int
val add = fn : int * int -> int
第二个函数创建函数类型为:

val add = fn : int -> int -> int
val add = fn : int * int -> int

对于相同的功能,这两种类型之间有什么区别?还有,为什么同一个函数有两种类型?

如果我们从你的两个定义中去掉语法糖,它们就会变成:

val add = fn x => fn y => x+y

因此,在第一种情况下,
add
是一个函数,它接受一个参数
x
并返回另一个函数,该函数接受一个参数
y
,然后返回
x+y
。这种通过返回另一个函数来模拟多个参数的技术称为curry

在第二种情况下,
add
是一个函数,它将一个元组作为参数,然后添加元组的两个元素

这也解释了这两种不同的类型
->
是函数箭头,它关联到右边,意思是
int->int->int
int->(int->int)
相同,描述了一个函数,它接受
int
并返回
int->int
函数


另一方面,
*
是用于元组类型的语法,即
int*int
是包含两个int的元组类型,因此
int*int->int
(括号中为
(int*int)->int
,因为
*
的优先级高于
->
)描述一个函数,该函数接受两个int的元组并返回一个int。

如果我们从两个定义中删除语法糖,它们将变成:

val add = fn x => fn y => x+y

因此,在第一种情况下,
add
是一个函数,它接受一个参数
x
并返回另一个函数,该函数接受一个参数
y
,然后返回
x+y
。这种通过返回另一个函数来模拟多个参数的技术称为curry

在第二种情况下,
add
是一个函数,它将一个元组作为参数,然后添加元组的两个元素

这也解释了这两种不同的类型
->
是函数箭头,它关联到右边,意思是
int->int->int
int->(int->int)
相同,描述了一个函数,它接受
int
并返回
int->int
函数


另一方面,
*
是用于元组类型的语法,即
int*int
是包含两个int的元组类型,因此
int*int->int
(括号中为
(int*int)->int
,因为
*
的优先级高于
->
)描述一个函数,该函数接受两个整数的元组并返回一个整数。

这两个函数之所以不同,是因为出现了
Currying
现象。具体来说,Currying是一种编写任意函数的能力,其中dom(f)=R^{n}作为一个函数,从
R
n
-次获取输入。这基本上是通过确保每个输入为下一个变量返回一个函数来实现的。这就是
->
符号所代表的-它是
库里-霍华德同构的基本结果。因此:

fun addCurry x y = x + y (* int -> int -> int *)
fun addProd (x,y) = x + y (* (int*int) -> int *)
告诉我们,
addCurry
是将
addProd
简化为可用于“替换”和返回变量的形式。因此,
addProd
addCurry
在上下文上是等价的。然而,它们在语义上并不等价。
(int*int)
是一种产品类型。它说它需要
input1=int
input2=int
int->int
表示它接受
int
并返回
int
。这是箭式的

如果您感兴趣,您可能还想知道SML函数只有两种参数:

1) 咖喱


2) 元组-因此,
fun addProd(x,y)
(x,y)
表示为函数参数的元组。

这两个函数之所以不同,是因为
Currying
的现象。具体来说,Currying是一种编写任意函数的能力,其中dom(f)=R^{n}
作为一个函数,从
R
n
-次获取输入。这基本上是通过确保每个输入为下一个变量返回一个函数来实现的。这就是
->
符号所代表的-它是
库里-霍华德同构的基本结果。因此:

fun addCurry x y = x + y (* int -> int -> int *)
fun addProd (x,y) = x + y (* (int*int) -> int *)
告诉我们,
addCurry
是将
addProd
简化为可用于“替换”和返回变量的形式。因此,
addProd
addCurry
在上下文上是等价的。然而,它们在语义上并不等价。
(int*int)
是一种产品类型。它说它需要
input1=int
input2=int
int->int
表示它接受
int
并返回
int
。这是箭式的

如果您感兴趣,您可能还想知道SML函数只有两种参数:

1) 咖喱


2) 元组-因此,
fun addProd(x,y)
(x,y)
表示为函数参数的元组。

在int->int->int的情况下,是不是因为在add首先取一个int,返回另一个取另一个int的函数,然后返回最终的int的情况下,使用了curry,这是不是因为“加法”首先取一个整数,然后返回另一个取另一个整数的函数,最后返回最后一个整数?是的,你是对的。发现这篇关于SML中的咖喱的有用文章。是的,你是对的。发现这篇关于SML中的咖喱的有用文章。