関数

Scalaの関数プログラミングにおける「関数」は、非常に重要な要素であり、Scalaが関数型言語オブジェクト指向言語の両方の性質を併せ持つことを象徴する機能です。以下に、「関数」の基本概念、記法、特徴について詳しく説明します。


1. 関数とは

Scalaにおける「関数」は、入力(引数)を受け取り、出力(戻り値)を返す処理のまとまりです。関数は値(ファーストクラス市民)として扱えるため、変数に代入したり、他の関数に引数として渡すことができます。


2. 関数の定義方法

2-1. 通常の関数定義(def を使用)

scala
def add(x: Int, y: Int): Int = { x + y }
  • def は関数の定義を意味します。

  • x: Int, y: Int は引数。

  • : Int は戻り値の型。

  • x + y は処理内容(式)。

2-2. 関数リテラル(無名関数)

Scalaでは関数を無名で定義することも可能です:

scala
val add = (x: Int, y: Int) => x + y
  • (x: Int, y: Int) => x + y が無名関数(ラムダ式)です。

  • val を使って変数 add に代入しているため、後で使用可能です。


3. 関数の型

関数は特別な型として扱われます。たとえば、(Int, Int) => Int は「2つの整数を受け取り、整数を返す関数」を表します。

scala
val add: (Int, Int) => Int = (x, y) => x + y

このように、関数は**関数型(FunctionN)**として扱われ、Nは引数の数を意味します。


4. 高階関数(Higher-Order Function)

Scalaでは、関数を引数として受け取ったり、関数を戻り値として返す関数を「高階関数」と呼びます。

例:引数に関数を取る高階関数

scala
def operate(f: (Int, Int) => Int, x: Int, y: Int): Int = { f(x, y) } val result = operate((a, b) => a * b, 3, 4) // 12

5. カリー化(Currying)

カリー化とは、複数の引数を取る関数を、1つの引数を取る関数の連鎖に変換する手法です。

scala
def add(x: Int)(y: Int): Int = x + y val add3 = add(3) _ val result = add3(4) // 7

6. クロージャ(Closure)

Scalaの関数はクロージャとして、関数の外で定義された変数にアクセスできます。

scala
val factor = 2 val multiply = (x: Int) => x * factor println(multiply(5)) // 10

multiply 関数は factor 変数を「閉じ込めて」使用しています。


まとめ

Scalaにおける関数の特徴は以下の通りです:

  • def または無名関数として定義可能

  • 関数も値として扱える(ファーストクラス関数)

  • 関数型で型安全に表現可能

  • 高階関数やクロージャなど関数型プログラミングの要素を活用可能

  • カリー化により部分適用も可能

これらの特性により、Scalaでは柔軟で表現力の高いコードを書くことができます。

生成日:2025/05/04