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