SML / NJ中的Tuppled函数与curried函数性能

时间:2014-01-30 17:00:54

标签: sml smlnj currying

我正在学习使用SML语言的函数式编程。在阅读我的学习笔记时,我遇到了一个问题,即询问哪种功能(tuppled或curried)表现得更快。

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

我认为我的导师曾经说过,这是因为咖喱功能会产生更多的闭合,但我认为我听不到正确的声音。

有人可以详细说明这个吗?

1 个答案:

答案 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

因此涉及一些额外的步骤。但是,它当然不应该导致程序中出现性能问题。