QuickCheck の使い方を覚えたいなぁ。というわけで、まだこれから。
と、誰かが書いてから一向に文章が増えないので、僕も挑戦しよう。
プログラムの満たすべき「性質」を定義すると、その性質を本当に満たしているかどうかを 確認する「テスト」を“自動的に”生成して検査するライブラリ。
英語が平気な人は、QuickCheck のマニュアルを読んだ方が良い。
import Debug.QuickCheck
prop_true x = True
where types = x::Int
prop_false x = False
where types = x::Int
prop_head x = x == head [x]
where types = x::Int
prop_head' x xs = x == head (x:xs)
where types = (x::Int, xs::[Int])
接頭辞 prop_ には何の意味もない。適当な名前 (i_want_to_check x = ... ) でもよい。 ただし、引数が最低一つは必要で、かつ、引数の型を "types" という関数で教える必要がある(テストできる型に型推論できる場合はその必要はないが、しかしテストできる型が何かなんて最初は知らないので...)。 というのは、自動生成されるテストは引数の型を利用して作られるからである。 (型を持たない言語(Erlang)にもトリックを利用してQuickCheckが移植されているらしい)
*Main> quickCheck prop_true OK, passed 100 tests. *Main> quickCheck prop_false Falsifiable, after 0 tests: 0 *Main> quickCheck prop_head OK, passed 100 tests. *Main> quickCheck prop_head' OK, passed 100 tests.
小泉総理: 1 は素数。3 は素数。5 は素数。7 は素数。全てに明確に答弁している。
primes = map head $ iterate sieve [2..] sieve (p:xs) = [ x | x <- xs, x `mod` p /= 0] prop_odd_prime x = (mod x 2) == 1 && (x > 2) ==> elem x (take 1000 primes)
*Main> quickCheck prop_odd_prime Falsifiable, after 26 tests: 9