関数型言語

関数型言語

関数型言語とは

関数型言語(Functional Programming Language)とは、プログラムを「関数」の集合として記述するプログラミングパラダイムの一つです。変数の状態を変更せず、データを入力として関数を適用し、新しいデータを出力することに重点を置いています。

関数型言語の特徴

関数型言語は、以下のような特徴を持ちます。

  • 純粋関数(Pure Functions): 関数の出力は、入力のみで決まり、副作用がない。
  • イミュータビリティ(不変性): 変数の値を変更せず、新しい値を作成する。
  • 高階関数(Higher-Order Functions): 関数を引数に取ったり、関数を返したりすることができる。
  • 再帰(Recursion): ループの代わりに、関数の中で自身を呼び出すことで繰り返し処理を行う。
  • 遅延評価(Lazy Evaluation): 必要な時にのみ計算を実行する。

代表的な関数型言語

以下に、代表的な関数型言語を紹介します。

1. Haskell

Haskellは、純粋関数型プログラミング言語であり、高い型安全性と遅延評価を特徴とします。

-- フィボナッチ数列を求める関数
fib :: Int -> Int
fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)

main = print (fib 10)

2. Lisp

Lisp(LISt Processing)は、関数型プログラミングの原点とも言える言語であり、AI開発などで利用されています。

(defun factorial (n)
  (if (<= n 1)
      1
      (* n (factorial (- n 1)))))

(print (factorial 5))

3. Clojure

Clojureは、Lisp系の関数型言語であり、JVM(Java仮想マシン)上で動作します。

(defn factorial [n]
  (if (<= n 1)
    1
    (* n (factorial (- n 1)))))

(println (factorial 5))

4. F#

F#は、.NET環境で動作する関数型言語で、オブジェクト指向の概念も取り入れています。

let rec factorial n =
    if n <= 1 then 1
    else n * factorial (n - 1)

printfn "%d" (factorial 5)

5. Scala

Scalaは、オブジェクト指向と関数型プログラミングを融合した言語であり、JVM上で動作します。

def factorial(n: Int): Int = {
    if (n <= 1) 1
    else n * factorial(n - 1)
}

println(factorial(5))

6. Elixir

Elixirは、Erlang VM上で動作する関数型言語であり、高い並行処理能力を持つ。

defmodule Factorial do
  def calc(0), do: 1
  def calc(n), do: n * calc(n - 1)
end

IO.puts Factorial.calc(5)

関数型言語のメリット

  • バグが少ない: 副作用を排除することで、予測可能なコードになる。
  • 並列処理に強い: イミュータビリティを活用し、スレッドセーフなコードを書きやすい。
  • コードの再利用性が高い: 高階関数や再帰によって、モジュール化しやすい。

関数型言語のデメリット

  • 学習コストが高い: 再帰や高階関数の概念に慣れるのが難しい。
  • パフォーマンス面の課題: 遅延評価やガベージコレクションによるオーバーヘッドが発生することがある。
  • 普及率が低い: JavaやPythonに比べると、実務での利用が少ない。

まとめ

関数型言語は、数学的な関数の概念を利用してプログラムを記述する言語であり、副作用を排除し、安全で信頼性の高いコードを書くのに適しています。並列処理やデータ処理に強い特徴を持ち、近年ではScalaやF#のようにオブジェクト指向と組み合わせた言語も増えています。