從Ninety-Nine Haskell Problems:單元測試IO INT和類似在Haskell
Question 23:提取從列表中隨機選擇的元件的給定數目。
這是部分解決方案。爲了簡單起見,這段代碼只是從列表中選擇一個元素。
import System.Random (randomRIO)
randItem :: [a] -> IO a
randItem xs = do
i <- randomRIO (0,length xs - 1)
return $ xs !! i
所以randItem [1..10]
將通過10
返回對應於(但不等於)的IO Int
一些詮釋從1到目前爲止,一切都很好。但是,我可以爲我的randItem函數編寫什麼樣的測試?什麼關係 - 如果有的話 - 我可以確認輸入和輸出之間的關係嗎?
我可以使用與上述函數相同的邏輯來生成m Bool
,但我無法弄清楚如何測試m Bool
。謝謝。
我想你想定義'randItem':: SomeClass m => [a] - > m a',其中'SomeClass'提供了一個函數來代替'randomRIO'。然後,如果你爲'IO'定義了一個適當的'SomeClass'實例,你可以使用'randItem'[1..10] :: IO'獲得一個隨機值,或者'randItem'[1..10]: :SomeTestMonad',它提供了另一種確定性的用於測試的'randomRIO'替代實現。 – chepner
'randItem :: [a] - > IO a'然後就是'randItem''到'IO'類型的一個特殊化。 – chepner
@chepner爲什麼要定義一個新的類型類? 「RandomGen」有什麼問題? –