2012-03-25 65 views
9

當我想用QuickCheck測試純代碼時,我經常必須編寫一個Arbitrary實例。要測試一元代碼,我可以使用Test.QuickCheck.Monadic,如article中所述。是否有與QuickCheck一起使用的Monadic版本的任意版本?

我的問題是:是否有一些規範的方式來生成依賴於monadic上下文的數據?特別是,有沒有一些單調的任意版本?你將如何去生成需要單一上下文的數據?

回答

3

隨機生成上下文

只生成適當的隨機一元上下文。如果你正在進行測試,你不能留在純虛擬的monad土地上,你實際上必須選擇一個特定的monad來測試。你選了單子單子嗎?隨機生成一個列表作爲上下文。國家monad?隨機地爲上下文生成一個狀態類型的值。作家?隨機生成一個日誌。

隨機產生一個動作

那麼你想要產生什麼,完全是什麼?如果它是一次性動作,那麼您需要提供一種基於其獨特基元爲您的特定monad生成一次性動作的方法。例如隨機生成的狀態行爲應該從狀態原語getput中隨機構建。

把它們放在一起

如果使用快速檢查的能力,以產生一個功能f產生一個單子的行動,並使用快速檢查,以產生一個上下文c,那麼你可以簡單地c >>= f把它們放在一起。或者您可以直接生成動作a,並執行c >> a

6

Gen基本上是你用於在monad框架中使用Arbitrary實例的原因,因爲Arbitrary類型類基本上只是Gen a生成器的提供者。

相關問題