カリー化された関数の有効な使い方の 1 つは、コード量の削減です。
3 つの関数を考えてみましょう。そのうちの 2 つはほとんど同じです。
(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
です。
これらの関数を、利用可能な多くの命令型の一般的な言語で行うように定義しました (それらの一部には、関数の世界で通常見られるラムダ、カリー化、およびその他の機能が含まれています。これらはすべて非常に便利なためです)。
All add
and do は、への呼び出しを適切な でsum
ラップしています。ここで、これらの関数のカリー化された定義を検討してください。action
kind
(define add-curried
((curry action) +))
(define mul-curried
((curry action) *))
それらはかなり短くなりました。action
1 つの引数のみを渡して関数kind
をカリー化し、残りの 2 つの引数を受け入れるカリー化された関数を取得しました。
このアプローチにより、記述するコードが少なくなり、保守性が高くなります。
action
関数がすぐに書き換えられて、さらに 3 つの引数を受け入れることを想像してみてください。カリー化しないと、 and の実装を書き直す必要がありadd
ます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