所以我有两种数据类型。为简单起见,举一个Int
和一个持有String
。随机选择和填充数据类型
所以我们可以说我有
data ranData = randInt Int | randString String
我怎样才能让一个函数,要么选择其中一个,然后给它一个随机值。我有一些想法,但他们相当不雅。
所以我有两种数据类型。为简单起见,举一个Int
和一个持有String
。随机选择和填充数据类型
所以我们可以说我有
data ranData = randInt Int | randString String
我怎样才能让一个函数,要么选择其中一个,然后给它一个随机值。我有一些想法,但他们相当不雅。
假设你要使用的MonadRandom
包:
import Data.Functor ((<$>))
import Control.Monad.Random
data RanData = RandInt Int | RandString String deriving Show
randomData :: (RandomGen g) => Rand g RanData
randomData = do
shouldBeString <- getRandom -- Generate Bool
if shouldBeString
then do
len <- getRandomR (0, 10) -- Generate Int between 0 and 10
RandString . take len <$> getRandoms -- Take between 0 and 10 random chars
else RandInt <$> getRandom -- Generate random Int
-- How to use:
main :: IO()
main = print =<< evalRandIO randomData -- There are many other ways, too
的功能将产生在Rand
单子一RanData
,一些随机数发生器g
。 evalRandIO
函数将使用StdGen
随机数生成器提取随机RanData
。还有很多其他随机数生成器和运行它们的方法;这只是一个例子。
QuickCheck的Arbitrary
class与一些useful functions。
你任意实例看起来等同于预先定义的任一情形:
instance (Arbitrary a, Arbitrary b) => Arbitrary RanData where
arbitrary = oneof [liftM RandInt arbitrary, liftM RandString arbitrary]
shrink (RandInt x) = [ RandInt x' | x' <- shrink x ]
shrink (RandString y) = [ RandString y' | y' <- shrink y ]
记住类型名称和构造函数必须以大写字母开始:'数据RanData = RandInt国际| RandString String'。 – sdcvvc 2012-07-29 22:45:01
这不是两种数据类型。它是一种具有两种不同构造函数的单一数据类型。 – 2012-07-30 15:19:13