カリー化

Scalaの関数型プログラミングにおける**「カリー化(Currying)」**とは、複数の引数を取る関数を、1つの引数を取る関数の連鎖として定義・変換する手法です。数学者ヘンリー・カリー(Haskell Curry)にちなんで名づけられました。


カリー化の概要

通常、複数の引数を取る関数は次のように定義されます:

scala
def add(x: Int, y: Int): Int = x + y

この関数を「カリー化」すると、以下のように書くことができます:

scala
def curriedAdd(x: Int)(y: Int): Int = x + y

ここで、curriedAdd引数 x を受け取り、引数 y を取る新たな関数を返すという形式になります。


カリー化の利点

  1. 部分適用が可能
    一部の引数だけを与えて関数を生成できます:

    scala
    val add5 = curriedAdd(5) // Int => Int 型の関数 println(add5(10)) // 出力: 15
  2. 関数合成や高階関数と相性が良い
    カリー化は関数型スタイルにおいて、関数の組み合わせや抽象化を自然に行う助けとなります。

  3. ライブラリやAPI設計における柔軟性
    型安全な形で引数の適用順を制御できます。特に複雑なロジックの構築時に有用です。


カリー化関数の定義と使用例

scala
def multiply(x: Int)(y: Int): Int = x * y val double = multiply(2) // 2倍する関数を定義 val triple = multiply(3) // 3倍する関数を定義 println(double(5)) // 出力: 10 println(triple(5)) // 出力: 15

関数のカリー化変換

Scalaの標準ライブラリには、通常の関数をカリー化関数に変換する機能もあります:

scala
val add = (x: Int, y: Int) => x + y val curried = add.curried val add10 = curried(10) println(add10(3)) // 出力: 13

まとめ

特徴 内容
定義形式 def func(x: A)(y: B): C
利用目的 引数の部分適用、柔軟な関数合成
メリット 高階関数との親和性、コードの再利用性向上

Scalaでは関数型プログラミングの強力な要素として、カリー化を通じた関数の再利用性と柔軟性の向上が非常に重要です。

生成日:2025/05/04