関数についての違和感

大学では, 応用数学を専攻していた.

大学でならった関数の定義は, ある集合から別の集合への写像だった.

就職して, C 言語でプログラムを書くようになってからずっと, どうも関数にたいして違和感を抱いてきた.

なんでこれが関数なんだ??

int main (void) {
  printf ("Hello, World!");
  return 0;
}

以下のページに同じようなことがかかれていたので引用.

x = x + 1

古き良き小学校の時代, この行には困惑させられたものだった. 魔術的な x が, 加算されたのに等しいままでいる事に. どういうわけか, プログラミングを始めると, それに構わなくなる. 「やれやれ, それは重大な事柄じゃないし, プログラミングとは現実のビジネス行為なんだから, 数学的な純粋さについてあら探しなんて必要無い (その議論なら, 大学にいる狂った髭面野郎どもにさせておけばいい) 」と思っていた. けれども, ただ知らなかっただけで, 我々が間違っていて高い代償を支払っていたのは 明らかである.

Haskell における関数の定義

最近, プログラミング Haskell という本を読んだ.

https://amzn.to/3G092W9

その中での関数の定義を読み, 自分が思ってきた関数のイメージと一致した.

関数は, ある型の引数を他の型の引数の結果に変換する. 型とは, 互いに関連する値の集合.

これだ! と思った.

これが大学でならった関数の定義だ. 関数型言語というのは数学に近いときいていたが, それを感じた瞬間だった.

うれしかったので, 今回の記事にしてみた. もっと, 関数型言語について知りたいと思った.

C 言語と Java における関数の定義

C 言語 (手続き型) と Java (オブジェクト指向型) における関数の定義について も, Wikipedia で調べてみたので, 書いておく.

関数型における関数とは, 意味するところは違う. これが, 違和感の正体だった.

C 言語 (手続き型パラダイム)

戻り値つきのサブルーチン.

プログラム中で意味や内容がまとまっている作業をひとつの手続きとしたもの.

Java (オブジェクト指向パラダイム)

あるクラスないしオブジェクトに所属するサブルーチン.

各オブジェクトが持っている自身に対する操作. オブジェクトは「データ」と「手続き」から成っているが, その「手続き」の部分に当たる.