関数型言語

目次
関数型言語とは
関数型言語(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#のようにオブジェクト指向と組み合わせた言語も増えています。