見出し画像

関数型プログラミング事始め (41) 評価(3)

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

関数型プログラムならではの評価はどこを見ればいいのでしょうか。前回までは通常のプログラムの評価方法を見てきましたが、今回は関数型ならではの評価を見ていきますが、あまりありません。再帰呼び出しの段数や高階関数の段数はありますが、その他は通常のプログラムと同様なメトリクスで評価していくことになります。

4.3 関数型プログラムの評価

関数型プログラムの評価はどこをどのように見ればいいのでしょうか。前節では通常のプログラムの評価方法を見てきましたが、ここでは関数型プログラムならではの評価を見ていきます。

しかし関数型プログラムならではの評価はあまり多くありませんが、再帰呼び出しの段数や高階関数の段数などがあります。これらと通常のプログラムと同様なメトリクスで評価していくことになります。

ここでは関数プログラムならではの評価を行うメトリクスを見ていくことにします。

(1) 再帰呼び出し

通常のプログラムの評価では、関数呼び出し数(オブジェクト指向ではメッセージ送信数)、さらにこれと相関の強いコード行数のメトリクスで評価しています。関数型プログラムでもこれらのメトリクスを使って評価します。

これに加えて関数型プログラムの評価メトリクスとしては、関数呼び出しの中の再帰呼び出しに注目したメトリクスがあります。具体的には以下のものになります。

(a) 再帰呼び出し数再帰呼び出し率再帰率
直接の自己再帰だけでなく、間接的な他者再帰呼び出しを含めた関数呼び出しの個数を計測するものが再帰呼び出し数です。
1関数に再帰呼び出し数が多いと、その関数は複雑になり、よくありません。関数サイズに依存しますが閾値としては4個があります。

再帰呼び出し率は、再帰呼び出し数÷関数呼び出し数です。ただしこのメトリクスは関数型プログラミングでは関数呼び出しが多くなる傾向がありますので、再帰率が小さくても直ぐに問題があるとは限らないことに注意してください。

(b) 再帰呼び出しの段数の合計数、最大数
自身の関数に再帰するまでの関数呼び出しの回数を段数として数えます。自己再帰呼び出しは1段となります。
例えば、関数fで関数gの呼び出しがあり、関数gで関数hを呼び出し、関数hで関数fを呼び出したときの段数は3段になります。

再帰呼び出しの段数の合計数は、関数型プログラムではサイクロマティック数に相当するものになります。この閾値は再帰呼び出す数の1.5倍くらいです。再帰呼び出し数の閾値が4個なら、段数の合計数は6段になります。

再帰呼び出しの段数の最大数は、繰り返しプログラミングでの繰り返しの段数に相当します。その閾値は繰り返しが3段までと言われていますので、再帰の段数も3段になります。3段で既に複雑すぎます。

(2) 高階関数

高階関数に関するメトリクスを見ていきます。

(a) 高階関数数
高階関数の件数を計測するメトリクスです。高階関数は直観的に理解するのが難しいので、その閾値は小さくするのがいいでしょう。1関数に2個以内にした方がいいでしょう。

(b) 高階関数の階数の合計数、最大数
階数とは、引数や値に高階関数でない普通の関数を適用するときの階数を1階と数えます。引数や値に1階の高階関数を適用するときは、2階になります。同様にn階の高階関数とは、引数や値にn-1階の高階関数を適用するものです。

高階関数の階数の最大値は1階で十分です。2階で既に高すぎます。この意味では高階関数の階数の合計数も高階関数数と同じになります。つまり、この高階関数の階数のメトリクスは高階関数数と同じになり、このメトリクスは不要です。

しかし一部の関数型プログラミングの狂信者ではこの限りではありません。たぶん。きっと。

以上で関数型プログラムならでは評価は終わりますが、評価の多くは通常のプログラムと同様なメトリクスで評価を行います。

(予告) 終章. 関数型プログラミングのまとめ(本文最終回)

今まで40回以上の連載で関数型プログラミングを紹介してきましたが、次回は最終章として、関数型プログラミングのまとめを掲載する予定です。

なおこれは本文の最終回となるものですが、増補版として、手続き型プログラミングやオブジェクト指向プログラミングなどとの関係を断続的に紹介するように考えています。次回をお楽しみに。


いいなと思ったら応援しよう!

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