7

SumHaskellのヘッジホッグライブラリを使用して、次の結合性プロパティをテストしたいとします。

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つのアプローチの違いは何ですか?パフォーマンス、並列化、またはランダム性に何らかの影響がありますか?

4

1 に答える 1