読者です 読者をやめる 読者になる 読者になる

akimachoのはてなブログ

ICTとデザインのためのブログ

『プログラミングの基礎』読書日誌-16日目-

はじめに

今日は,第13章 一般化と高階関数です.

一般化

一般化のことを,本書では同じプログラムをより多くの場面で使えるようにすることとしています.そして,一般化はデータ,関数,型それぞれに行うことができるようです.

一般化の心得

似たような関数を作っていることに気がついたら一般化することを考えましょう。そのときにはまずふたつの定義を見比べて異なる部分を特定します。そして,その異なる部分を引数として受け取ってくるような関数を定義します。その上で,もとの関数を一般化した関数を使って定義し直します。最後に,新しく作った関数ももとのテストプログラムを通ることを確認します。p.123

関数の一般化

次は,関数の一般化をみていきます.

関数がfirst-classの値である

関数がfirst-classの値(第一級関数)であるとは,整数や文字列と同様に関数を引数や戻り値にすることが可能であることを指します.C言語でも関数ポインタがあるので,関数がfirst-classの値であるといえるのではないかと思ったのですが,wikipediaによれば,以下のようでfirst-classとはいえないそうです.

CやC++C#Pascalなどのプログラミング言語は関数ポインタをサポートしており、データ構造に含めたり他の関数に引数として渡したりすることができる。しかし、それらの関数は一般にリフレクションなしではプログラムの実行時に動的に生成することができないため、第一級関数をサポートしているとは見なされていない。

第一級関数 - Wikipedia

高階関数

高階関数(figher-order function)とは,関数を引数として受け取る関数のことを指します.高階関数を用いることで,関数を一般化することができます.

高階関数 - Wikipedia

型の一般化

型変数とは,「どのような型でもよい」ということを表すもので,'aや'bのように書きます.型変数を用いることで,型を一般化することができます.

  • 多相性(polymorphism)・・・どのような型でもよいという性質
  • 多相型・・・型変数を含むような型
  • 多相関数(polymorphic function)・・・多相型をもつ関数のこと
  • 単相関数(monomorphic function)・・・多相でない関数のこと

多相関数はより多くの型の引数を受け取れるため,単相関数よりも多くの場合で使えます。関数を作るときに型を限定する必要がないのであれば,多相関数にしておいた方が便利です.p.127

以上,高階関数と多相型を用いることで,より汎用的な関数を作ることができるようになるわけですね.

練習問題

第14章とまとめて解こうと思います.

おわりに

川徳之『関数プログラミング実践入門』p.176の中で,再帰の危険性が以下のように書かれています.

Haskellに慣れてくると直接的に再帰関数を書くのは避けるようになっていきます。それは,再帰関数は便利であるのと同じくらい,危険でもあるからです。停止しない再帰関数をうっかりかいてしまうこともあるでしょう。

確かに,今までやってきた再帰を使えばどのようなプログラムも組めるようになるように感じました.しかし,再帰を使うことで無限ループに陥ってしまうプログラムを組む危険性もあるわけです.

そう考えると,リスト全体に対する再帰高階関数に任せることで,本質的な処理にプログラマが集中できるようになり,プログラミングの負担は軽減するようになりますね.

プログラミングの基礎 (Computer Science Library)

プログラミングの基礎 (Computer Science Library)