我正在学习使用SML语言的函数式编程。在阅读我的学习笔记时,我遇到了一个问题,即询问哪种功能(tuppled或curried)表现得更快。
我查看了视频here,其中讲师说这是语言实现的问题,并说明(在5:25)SML / NJ使用tuppled函数执行得更快,但是没有说明原因。
我认为我的导师曾经说过,这是因为咖喱功能会产生更多的闭合,但我认为我听不到正确的声音。
有人可以详细说明这个吗?
答案 0 :(得分:1)
还有一些针对咖喱功能的中间评估。让我们说我们想要一个函数,所以总结三个数字。我们考虑以下两个定义:
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
另一方面,使用curried版本,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
因此涉及一些额外的步骤。但是,它当然不应该导致程序中出现性能问题。