2016-04-27 39 views
-2

我試圖生成任意大小的元素爲我的自定義數據類型的任意元素:快速檢查發電機 - 自定義類型

newtype ZippList a = ZPL ([a], [a]) 
    deriving (Show) 

這是我得到:

instance Arbitrary a => Arbitrary (ZippList a) where 
arbitrary = sized zipplist where 
    zipplist n = do 
     firstLength <- choose(0,n) 
     secondLength <- n - firstLength 
     firstList <- [arbitrary :: Gen a | [1..firstLength]] 
     secondList <- [arbitrary :: Gen a | [1..secondLength]] 
     return $ ZPL (firstList, secondList) 

但是它並不能編譯。該編譯失敗了生成a的兩個列表。我怎樣才能生成一個任意的?

該死的,我有點忘了實際產生的值與_ <- ..對不起,一個微不足道的問題,我是編碼的時間很晚。

回答

2

這對我的作品

instance Arbitrary a => Arbitrary (ZippList a) where 
    arbitrary = sized zipplist where 
    zipplist n = do 
     firstLength <- choose (0, n) 
     let secondLength = n - firstLength 
     firstList <- sequence [arbitrary | _ <- [1..firstLength]] 
     secondList <- sequence [arbitrary | _ <- [1..secondLength]] 
     return $ ZPL (firstList, secondList) 

注意secondLength的定義不使用單子,所以你應該使用let

+0

'序列[任意| _ < - [1..firstLength]]'看起來很像'replicateM firstLength random'給我! – epsilonhalbe

+1

@epsilonhalbe我也更喜歡你的方式,但理解方法似乎是快速啓動出於某種原因的慣用,請參閱https://www.schoolofhaskell.com/user/griba/quick-check-generator-of-pair-List- index-where-index-list-range – jamshidh

+0

該死的,我有點忘了用'_ <-'實際生成值..對於這個微不足道的問題,我正在編碼時間很晚。無論如何感謝您的答案。 – VSZM