1

SmallCheck を使用してコードをテストしたいと考えています。int のペアの任意のリストを生成することができましたが、それは私の型に含める必要があるものではありません。リストは一連の範囲を表し、[1,3),[4,6)としてエンコード/保存され[(1,3),(4,6)]ます。

これらは、私の範囲の正規化された形式の不変条件です:

fst a < snd a 
snd a < fst b where a is before b in the list

これを SmallCheck に伝えて、不変条件を満たしていないために破棄する大量の値が生成されないようにしたいと思いますが、おそらくそれは不可能です。

不変条件を満たすリストを生成するにはどうすればよいですか?

4

2 に答える 2

3

組み込み型 (Int、List) よりもアプリケーション固有の型を優先します。これは、SmallCheck だけでなく、あらゆる言語のあらゆるソフトウェアに対するアドバイスです。

data Interval = Interval (Int,Int)
data Domain = Domain [Interval]

不変条件を適用するスマート コンストラクターを記述します。

interval :: Int -> Int -> Interval
interval x y = Interval (min x y, max x y) -- if you want this

domain :: [Interval] -> Domain
domain ints = Domain ... (something that sorts intervals, and perhaps merges them)

次に、これらを使用して Serial インスタンスを作成します。

于 2016-04-05T17:51:10.897 に答える
0

この問題は、ユーザー定義型を使用するとよりよく解決されることに同意します。

昇順でソートされた互いに素な半開間隔のプロパティを持つアルゴリズムを作成していると仮定します。次に、Serialインスタンスを示します。

私は、一方をもう一方の観点から実装するのではなくInterval、さまざまなジェネレーターを提供することにしました。AscDisjIntervals

のアルゴリズムAscDisjIntervalsは、すでにコメントに書いたとおりです

  • 負でない s のリストを生成する(これはオーバーフローIntegerを避けるためです)Int
  • これらの整数を合計します (これにより、すべての値の昇順がアサートされます
  • このリストからペアを生成します (リストの要素数が奇数の場合、最後の単一要素を破棄します)

Intervals.hs

{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}
module Intervals where

newtype Interval = I (Integer,Integer) deriving(Eq)

instance Show Interval where
    show (I (a,b)) = "["++show a ++ ", "++ show b ++ "]"

instance Monad m => Serial m Interval where
    series = let a_b a b = I (getNonNegative $ min a b , getNonNegative $ max a b) 
             in cons2 a_b

newtype AscDisjIntervals = ADI [Interval] deriving (Eq)

instance Show AscDisjIntervals where
    show (ADI x) = "|- "++ (unwords $ map show x) ++ " ->"

instance Monad m => Serial m AscDisjIntervals where
    series = cons1 aux1

aux1 :: [NonNegative Int] -> AscDisjIntervals
aux1 xx = ADI . generator . tail $ scanl (+) 0 xx
  where generator [] = []
        generator (_:[]) = []
        generator (x:y:xs) = let i = I (getNonNegative x ,getNonNegative y)
                        in i:generator xs

注: プログラムをコンパイルしただけで、プロパティはテストしていません。

于 2016-04-05T21:24:00.107 に答える