smallcheck プロパティ ベースのテスト ライブラリを Tasty と組み合わせて使用する方法を見つけようとしています。
複数フィールドのレコード型で問題が発生しました: Serial
typeclass の 4 つ以上のフィールド メンバーを持つレコード型を作成するにはどうすればよいですか?
これが通常の方法だと思います:
{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}
import Test.Tasty
import Test.Tasty.SmallCheck
import Test.SmallCheck.Series
data T1 = T1 { p1 :: Int,
p2 :: Char,
p3 :: [Int]
} deriving (Show, Eq)
instance (Monad m) => Serial m T1 where
series = cons3 T1
main :: IO ()
main = defaultMain tests
tests :: TestTree
tests = testGroup "Tests" [scProps]
scProps = testGroup "(checked by SmallCheck)"
[ testProperty "Test1" prop_test1
]
prop_test1 x y = x == y
where types = (x :: T1, y :: T1)
これは機能し、もちろん「Test1」は失敗します。consN
ただし、関数は最大 4 つのパラメータを取るように定義されているため、このアプローチは 4 つを超えるフィールドを持つレコード タイプでは機能しません。関数が宣言されているモジュールへのリンクは次のとおりです。Test.SmallCheck.Series
次のような場合:
data T1 = T1 { p1 :: Int,
p2 :: Char,
p3 :: Int,
p4 :: Int,
p5 :: [Int]
} deriving (Show, Eq)
それを追加する方法は何Serial
ですか?私はこのようなジェネリックを使用してみました:
{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}
{-# LANGUAGE DeriveGeneric #-}
import Test.Tasty
import Test.Tasty.SmallCheck
import Test.SmallCheck.Series
import GHC.Generics
data T1 = T1 { p1 :: Int,
p2 :: Char,
p3 :: [Int]
} deriving (Show, Generic)
instance Serial m a => Serial m T1
しかし、ghc は次のメッセージで上記の例を受け入れることを拒否します:
Variable occurs more often in a constraint than in the instance head
in the constraint: Serial m a
(Use -XUndecidableInstances to permit this)
In the instance declaration for `Serial m T1'
よろしくお願いします!
ジュール