2013-10-30 30 views
2

我想寫一個使用IO的SmallCheck屬性,但我無法弄清楚我應該怎麼做。具體而言,我們的目標是編寫一個屬性爲Testable IO Bool的實例,以便我可以將它送入smallCheck(或testPropertytest-framework)。不幸的是,我可以拿出最好的是以下幾點:如何在SmallCheck中使用monadic屬性?

​​

這不起作用,因爲它是Testable IO (IO Bool)而非Testable IO Bool的實例,但我無法弄清楚如何將它改寫,使其作品。

任何幫助,將不勝感激。

回答

3

您想要monadic組合子。它需要一個任意monad m並將其包裝到Property中,這是Testable的一個實例。

smallCheck 5 $ \(x :: Int) -> monadic $ (return True :: IO Bool) 
1

原來有一個函數,它正是我想要的:

monadic :: Testable m a => m a -> Property m 

您可以使用它,像這樣:

smallCheck 5 $ \(x :: Int) → monadic (putStrLn (show x) >> return True) 

特別要注意如何monadic需求後,嵌套函數參數。