初学者Haskell,快速检查生成器

时间:2018-12-02 15:24:15

标签: haskell

我想生成越来越多的列表,即

 prelude>sample' incList
 [[],[19],[6,110],[24,67,81]....]

我应该如何使用vectorOf?

 incList:: Gen [Integer]
 incList=   
 do x<-vectorOf [0..] arbitrary
    return x

我想不出一次只从列表中取出第一个数字的方法:/也许fmap的东西取1,我不知道。

1 个答案:

答案 0 :(得分:2)

我认为您的目标是一次做太多事情。让我们首先为生成的Ord ered对象的随机列表构造一个生成器,该列表具有给定长度的升序:

import Data.List(sort)

incList :: (Arbitrary a, Ord a) => Int -> Gen [a]
incList n = fmap sort (vectorOf n arbitrary)

现在,我们可以构造一个Gen生成器,通过每次将大小增加一个来生成无穷尽的列表:

incLists :: (Arbitrary a, Ord a) => Gen [[a]]
incLists = mapM incList [0..]

然后我们可以使用generate :: Gen a -> IO [a]从此Gen生成器生成值:

Prelude File> generate incLists :: IO [[Int]]
[[],[-19],[6,25],[-19,-14,15],[-4,6,20,28],[-23,-19,-6,-1,22],[-29,-21,-13,-9,-9,15],[-23,-15,-4,3,3,27,27],[-29,-29,-26,-25,18,19,23,27],[-24,-23,-16,-14,0,13,17,17,23],[-29,-15,-12,-4,-1,1,2,20,22,26],[-26,-24,-22,-16,-12,5,5,10,11,25,29],[-29,-28,-20,-14,-9,-7,-3,14,15,20,26,28],...]