見出し画像

関数型プログラミング事始め (1) 定義

関数型プログラミングがはじめての方へ贈る入門の書
次節:効能
参考書:
・五味 弘「はじめてのLisp関数型プログラミング」技術評論社(2016)
・大山口 通夫、五味 弘「プログラミング言語論」コロナ社(2008)
・五味 弘「関数型プログラミングと数学(ITと数学)」技術評論社(2021)


関数型プログラミングの定義として副作用のない純粋関数としてのプログラミングを紹介しています。副作用のある普通のプログラミングも紹介し、両者の違いを感じてください。

1章. 関数型プログラミングとは

この章では関数型プログラミングとは何かを見ていきます。関数型プログラミングが今までのプログラミングとどこが違うのか、手続き型プログラミングやオブジェクト指向プログラミングなどとどこが違うのかを見ていきます。

1.1 関数型プログラミングの定義=副作用がない関数

関数型プログラミングとは、一言で言って、数学の関数(*)を使ってプログラミングすることです。

(*) ここではプログラムの関数と区別するために、数学の関数を「純粋関数 pure function」と呼ぶことにします。本当はプログラムの関数を「不純関数」と呼びたいところですが。

数学の関数(純粋関数)は同じ引数に対して同じ値を返します。例えば log関数に100の引数を与えれば、log(100)=2となり、2の値をいつでも返します。どこからでも参照可能であることから、これを「参照透過性 referential transparency」と言います。

この数学の関数のふるまいはあまりにも当たり前のことであり、一般の人は当然だと思うでしょう。しかしプログラミングの世界では、この数学の常識が通じないのです。だからこの関数型プログラミングの意味があります。

プログラミングの関数では、同じ引数に対して同じ値を返すとは限りません。(一般の人が嘆いて曰く)なんということでしょうか。

例えば、以下の関数 fun を考えてみます。

int publicVariable = 0;
int fun(int x){
  publicVariable = publicVariable + x;
  return publicVariable;
}

最初は fun(100) は 100を返しますが、次の fun(100) は200を返します。
こうなってしまう原因は、グローバル変数 publicVariable が犯人です。これが前の値を保存しているからです。この関数は同じ引数に対し、同じ値を返しませんので、数学の関数ではありません。不純です。
つまりこれは関数型プログラミングではありません!

上記の関数 fun はグローバル変数によって、「状態 status」を持っていることになり、この状態によって「副作用 side effect」(*) が生じることになります。
つまり副作用がないのが関数型プログラミングです。

(*) 薬の副作用のように、本来の作用以外の作用を副作用と言います。
しかしプログラミングではこの副作用を本来の作用として積極的に使っていますが、関数型プログラミングの考えからは、これを副作用とみなします。
多くの非関数型プログラマからは避難ごうごうかもしれませんが。

ということで結論。「関数型プログラミングは副作用なし」以上です。

(おまけ) 4コマ漫画:関数型プログラミングって結局?

http://train.gomi.info/lisp/fpinlisp/cartoon11.html

(次回予告) 1.2 関数型プログラミングの利点=副作用がない利点

次回は副作用がない関数型プログラミングの利点を紹介します。

公開しました。関数型プログラミング事始め (2) 効能|五味弘 (note.com)

参考:プログラミング言語はどれがお得?(前編)|五味弘 (note.com)
参考:プログラミング言語はどれがお得?(後編)|五味弘 (note.com)

よろしければサポートをお願いします!