當我想用QuickCheck
測試純代碼時,我經常必須編寫一個Arbitrary
實例。要測試一元代碼,我可以使用Test.QuickCheck.Monadic
,如article中所述。是否有與QuickCheck一起使用的Monadic版本的任意版本?
我的問題是:是否有一些規範的方式來生成依賴於monadic上下文的數據?特別是,有沒有一些單調的任意版本?你將如何去生成需要單一上下文的數據?
當我想用QuickCheck
測試純代碼時,我經常必須編寫一個Arbitrary
實例。要測試一元代碼,我可以使用Test.QuickCheck.Monadic
,如article中所述。是否有與QuickCheck一起使用的Monadic版本的任意版本?
我的問題是:是否有一些規範的方式來生成依賴於monadic上下文的數據?特別是,有沒有一些單調的任意版本?你將如何去生成需要單一上下文的數據?
只生成適當的隨機一元上下文。如果你正在進行測試,你不能留在純虛擬的monad土地上,你實際上必須選擇一個特定的monad來測試。你選了單子單子嗎?隨機生成一個列表作爲上下文。國家monad?隨機地爲上下文生成一個狀態類型的值。作家?隨機生成一個日誌。
那麼你想要產生什麼,完全是什麼?如果它是一次性動作,那麼您需要提供一種基於其獨特基元爲您的特定monad生成一次性動作的方法。例如隨機生成的狀態行爲應該從狀態原語get
和put
中隨機構建。
如果使用快速檢查的能力,以產生一個功能f
產生一個單子的行動,並使用快速檢查,以產生一個上下文c
,那麼你可以簡單地c >>= f
把它們放在一起。或者您可以直接生成動作a
,並執行c >> a
。
Gen
基本上是你用於在monad框架中使用Arbitrary
實例的原因,因爲Arbitrary
類型類基本上只是Gen a
生成器的提供者。