コンテンツにスキップ

プログラミング/関数型プログラミング

出典: フリー教科書『ウィキブックス(Wikibooks)』

関数型プログラミングは、プログラムを関数の集合として捉え、副作用を排除することでプログラムの可読性や信頼性を高めるプログラミングスタイルです。ここでは、関数型プログラミングの特徴と具体的なコード例を解説します。

特徴

[編集]
  • 関数は引数と戻り値だけで、外部の状態を変更しない
  • 関数は再利用しやすいように細かく分割される
  • データの変換を高階関数を使って行うことが多い
  • 遅延評価や無限リストを使うことができる

コード例

[編集]

1. リストの要素を加算する

[編集]
# 非関数型プログラミング
def sum_list(lst):
    total = 0
    for x in lst:
        total += x
    return total

# 関数型プログラミング
def sum_list(lst):
    return reduce(lambda x, y: x + y, lst, 0)
この例はpython2で、リストの要素を加算する関数を非関数型プログラミングと関数型プログラミングで実装しました。非関数型プログラミングでは、ループを使ってリストの要素を加算していますが、関数型プログラミングでは、reduce関数を使ってリストの要素を加算しています。reduce関数は、リストの各要素に対して指定された関数を適用し、結果を累積する関数です。

2. リストの要素を2倍にする

[編集]
# 非関数型プログラミング
def double_list(lst):
    result = []
    for x in lst:
        result.append(x * 2)
    return result

# 関数型プログラミング
def double_list(lst):
    return list(map(lambda x: x * 2, lst))

# リスト内包表記
def double_list(lst):
    return [x * 2 for x in lst]
この例では、リストの要素を2倍にする関数を非関数型プログラミングと関数型プログラミングで実装しました。非関数型プログラミングでは、ループを使ってリストの要素を2倍にして新しいリストを作成していますが、関数型プログラミングでは、map関数を使ってリストの各要素に対して指定された関数を適用して新しいリストを作成しています。map関数は、リストの各要素に対して指定された関数を適用し、結果を新しいリストに格納する関数です。

関数型プログラミングの特徴と利点

[編集]

関数型プログラミングの特徴と具体的なコード例を挙げて、その違いを説明しました。ここからは、関数型プログラミングが持つさらなる特徴や利点について解説します。

  1. データ不変性(Immutability):
    関数型プログラミングでは、データは不変性を持ちます。つまり、一度定義されたデータは変更されることがなく、新しいデータを生成する際には変換や加工を行います。これにより、予測可能性や並行処理の安全性が向上します。
  2. 再帰(Recursion):
    再帰は関数型プログラミングの重要な概念であり、反復の代わりに再帰を使用して問題を解決します。再帰的なアプローチは、数学的帰納法と密接に関連しており、複雑な問題をシンプルな関数の組み合わせで解決する手法を提供します。
  3. 高階関数(Higher-Order Functions):
    高階関数は、他の関数を引数や戻り値として扱う関数です。関数をデータとして操作できるため、コードの再利用性が向上し、柔軟性が増します。例えば、mapやreduceなどの高階関数は、データ変換や集約を行う際に非常に便利です。
  4. 遅延評価(Lazy Evaluation):
    遅延評価は、評価の必要が生じるまで値を計算しない特性です。これにより、無限リストや遅延シーケンスを効率的に扱うことができます。必要なときにのみ計算を行うため、メモリ使用量を抑えつつ効率的なプログラムを実現できます。
  5. データ変換の統一性:
    関数型プログラミングでは、データ変換を高階関数や再帰的な関数で行うことが一般的です。この統一されたアプローチにより、コードの可読性が向上し、バグの発生確率が低くなります。

関数型プログラミングは、これらの特徴により、複雑な問題をシンプルに解決する手段を提供します。データの不変性や副作用の排除により、プログラムの保守性や拡張性が向上し、信頼性の高いコードを開発することが可能です。

上記の特徴や利点を持つ関数型プログラミングは、特に大規模で複雑なシステムの開発や並行処理の実装において、その真価を発揮します。そのため、関数型プログラミングは近年注目を集めており、多くのプログラマにとって重要なスキルとなっています。