簡単に言うと、与えられた自然数の有限集合に含まれない最小の自然数のことです。[3,5,2,9]だったら"0"が求めるべき最小自由数です。この集合の中では"2"が最小の自然数でありますが、この中に含まれない最小の自然数であるところの、この場合"0"が最小自由数というわけです。[2,0,4,3]でしたら最小自由数は"1"です。これをできるだけ速く求めたいんですね。ここではそういうアルゴリズムと実装を考えるんです。「方法」この本で紹介されているのは2つあります。一つは、「Haskellの配列を用いる方法」です。一方は、「分割統治法を用いる方法」です。一つ目から紹介します。「配列を用いる方法」もう正直眠いし、めんどくさいんで、本当に軽く説明させて頂きます。その考えに行き着いた経緯的なのとか省きます。本買って読みましょう。引数はリストですが、リスト受け取ってその長さ分の配列を作ります。有るor無いをBoolで表します。配列のFalseで一番小さい数を答え(最小自由数)として出します。checklist配列作った後に変えるのでStateモナドでモナります。配列の長さより大きい数は無視します。あったらTrueで書き込み。saerch関数はTrueの続く要素を取り出していって、最終的にその取り出した個数を返します(これが最小自由数と一致する)。[〜〜〜]みたいな感じで使います。ghciとか使ってロードして試してみましょう。分割統治法っていうのは簡単に言うとアレです。全部やると面倒い問題を分割して小さくして小さい方を解くみたいな感じではないでしょうか。xs,xs)再帰ですね。ガード記法、惚れ惚れしますね相変わらず。([条件を満たすリスト],[条件を満たさないリスト])で分け、これが(us,vs)に対応して定義されます。リストを与えられた値よりも小さいものとそうでないものに分割しています。プログラム見ていただければ""削ってる""ってのは分かって頂けると思います。このプログラムは先程のものより20%速いそうです。本にそう書いてありますし。なんか適当ですみません。なげやり過ぎますね(時間があったら加筆してもいいなとは思ってる)。ありがとうございました。