柯里化函数的一种有效用途是减少代码量。
考虑三个函数,其中两个几乎相同:
(define (add a b)
(action + a b))
(define (mul a b)
(action * a b))
(define (action kind a b)
(kind a b))
如果您的代码调用add
,它会依次调用action
kind +
。与 相同mul
。
您定义了这些函数,就像在许多可用的命令式流行语言中所做的那样(其中一些已经包括 lambdas、currying 和通常在函数世界中发现的其他特性,因为所有这些都非常方便)。
All add
and sum
do,就是action
用适当的kind
. 现在,考虑这些函数的柯里化定义:
(define add-curried
((curry action) +))
(define mul-curried
((curry action) *))
它们变得相当短。我们只是action
通过只传递一个参数来对函数进行 curried,the kind
,并得到接受其余两个参数的 curried 函数。
这种方法允许您编写更少的代码,并具有高度的可维护性。
试想一下,该函数action
将立即被重写以接受另外 3 个参数。如果没有柯里化,你将不得不重写你的add
and实现mul
:
(define (action kind a b c d e)
(kind a b c d e))
(define (add a b c d e)
(action + a b c d e))
(define (mul a b c d e)
(action * a b c d e))
但是柯里化让你免于那些讨厌且容易出错的工作;您甚至不必重写函数中的符号add-curried
,mul-curried
因为调用函数将提供传递给action
.