ちょっと違った処理にしてみる

ここまでのduplicateと代数的データ型というやつを使って、数直線上の線分の集合内に交わるものがあるかどうかを判定するプログラムを書いてみます(まんまSICPっぽい展開ですが・・・)。

duplicate cond (x:xs) = any (cond x) xs || duplicate cond xs
duplicate _ _ = False

data Range = Range {from::Integer, to::Integer}
makeArg xs = map (\ x -> Range {from = x * 2, to = (x + 1) * 2}) xs

main = do
	print $ duplicate
		(\ x y -> from x < to y && from y < to x)
		(makeArg [1..100] ++ [Range {from = 90, to = 110}])

うまく動いたくさいです。data〜の部分が、代数的データ型の定義部分です。代数的データ型というのは、いわゆる構造体のように使えるデータ型という解釈。共用体や、列挙型としても使えるらしい?メンバにアクセスするときに、メンバも関数として定義されているのか、メンバ(構造体)の形を取るみたいですね。
今日一日で少しは進んだかな、と思います。