Sum
Haskellのヘッジホッグライブラリを使用して、次の結合性プロパティをテストしたいとします。
a <> (b <> c) ≡ (a <> b) <> c
ランダムな入力を生成するには、実際には2つの方法があります。
1. すべてを生成Gen
(Gen
の Applicative および Monad インスタンスを使用)
genTriple :: Get (Int, Int, Int)
genTriple = liftA3 (,,) Gen.enumBounded Gen.enumBounded Gen.enumBounded
prop_assoc :: Property
prop_assoc = property $ do
(a, b, c) <- forAll genTriple
(Sum a <> Sum b) <> Sum c === Sum a <> (Sum b <> Sum c)
2. 各フィールドの生成forAll
prop_assoc :: Property
prop_assoc = property $ do
a <- forAll Gen.enumBounded
b <- forAll Gen.enumBounded
c <- forAll Gen.enumBounded
(Sum a <> Sum b) <> Sum c === Sum a <> (Sum b <> Sum c)
2つのアプローチの違いは何ですか?パフォーマンス、並列化、またはランダム性に何らかの影響がありますか?