Functional programming int->;之间的区别是什么;int->;int和(int*int)——>;SML中的int?
我注意到在SML中有两种定义函数的方法。例如,如果使用add函数,则有两种方法: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 *
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中的咖喱的有用文章。