SML/NJ中的元组函数与当前函数性能

SML/NJ中的元组函数与当前函数性能,sml,smlnj,currying,Sml,Smlnj,Currying,我正在用SML语言学习函数式编程。在阅读我的学习笔记时,我遇到了一个问题,询问哪种函数(折叠函数或咖喱函数)执行得更快 我看了视频,讲师说这是语言实现的问题,并指出(5:25)SML/NJ使用tupled函数执行得更快,但没有说明原因 我想我的指导老师曾经说过,这是因为curried函数创建了更多的闭包,但我想我没有听对 有人能详细说明一下吗?对于curried函数还有一些中间评估。假设我们想要一个函数,求三个数的和。我们考虑以下两个定义: fun sum (x,y,z) = x + y + z

我正在用SML语言学习函数式编程。在阅读我的学习笔记时,我遇到了一个问题,询问哪种函数(折叠函数或咖喱函数)执行得更快

我看了视频,讲师说这是语言实现的问题,并指出(5:25)SML/NJ使用tupled函数执行得更快,但没有说明原因

我想我的指导老师曾经说过,这是因为curried函数创建了更多的闭包,但我想我没有听对


有人能详细说明一下吗?

对于curried函数还有一些中间评估。假设我们想要一个函数,求三个数的和。我们考虑以下两个定义:

fun sum (x,y,z) = x + y + z
或者

fun sum x y z = x + y + z
考虑第一个版本的以下粗略评估跟踪:

:> sum(1,2,3)
   1 + 2 + 3 (substitution using pattern matching on the contents of the tuple)
   (1 + 2) + 3
   3 + 3
   6
另一方面,对于当前版本,SML将在计算表达式时动态构造一些匿名函数。这是因为curried函数利用了匿名函数可以作为其他函数的结果返回的事实,以便捕获将多个参数应用于单个函数的行为。构造函数需要一定的时间

:> sum 1 2 3
   ((sum 1) 2) 3
   (((fn x => (fn y => (fn z => x + y + z))) 1) 2) 3
   ((fn y => (fn z => 1 + y + z)) 2) 3
   (fn z => 1 + 2 + z) 3
   1 + 2 + 3
   (1 + 2) + 3
   3 + 3
   6
因此,还需要一些额外的步骤。但是,它肯定不会在程序中导致性能问题