昨日のコードのちょっとした説明
クイックソート
ここで使われてる面白い機能は「リストの内包表現 (list comprehension)」。実体は syntax sugar。
lt_x = [y | y <- xs, y < x]
これは「リスト xs から x より小さい要素を選び、それを集めたリストを lt_x とする」という意味。
数学における集合の表記
とちょうど対応していて、見た目でわかりやすい。
平方数の列挙
ここで使われている面白い機能は「無限リスト (infinite list)」。この機能を実現しているのが遅延評価 (lazy evaluation)。
map (\x -> x*x) [1..]
これで、1, 2, 3, ... と続く無限リストのそれぞれの要素に対し、x -> x*x という関数(写像)を作用させている。
perl の
map { $_*$_ } @list
と同じか。
そうして出来上がった平方数の無限リストから
print (take 5 ...)
で、先頭から 5 つの要素を取り出して表示いる。
print するときには実際にその要素がいくつであるかを知る必要がでてくるため、このときに初めて評価が行われる。
こういうのを遅延評価というらしい。
したがって、本当に無限のリストを作ってはいないわけだ。