2017-03-11 51 views
0

说我有这样的类型之一:哈斯克尔:获取替代型

data Cell = Empty | Full 

是否哈斯克尔提供了一个简单的方法来调用非确定性的一个或另一个这些构造的?基本上我试图随机调用哪个构造函数,例如[CellOfSomeType | i <- [1..somerange]]

+0

提示:'Empty'和'Full'是值,而不是你需要调用的函数(就像在OOP中一样)。 – MasterMastic

+0

好的,那么如何随机获取其中的一个值? – zzu

+0

使用['random'](http://hackage.haskell.org/package/random)包或其他选项。不好意思,我会提供更多的帮助,但我缺乏时间。 – MasterMastic

回答

3

只需获取一个随机位,并根据该位将值设置为FullEmpty。例如:

import System.Random 

你似乎在谈论System.Random,但这类信息应包括在这一问题。

data Cell = Full | Empty 
      deriving (Eq,Ord,Show,Enum) 

我推导Enum与远程随机使用。现在我们要为Random类定义一个实例,以便您可以使用几个公共库生成Cell类型的随机值。 Random类要求我们至少定义randomrandomR方法。

instance Random Cell where 
    random g = let (a,g') = random g 
       val = if a then Full else Empty 
      in (val,g') 
    randomR (l,h) g = let (a,g') = randomR (fromEnum l, fromEnum h) g 
        in (toEnum a, g') 

因为你的类型是相同的Bool我们就可以生成一个随机布尔(位),然后选择您的两个构造中的一个。范围随机更麻烦一点,但我们只是在请求的下限和上限之间生成一个Int,然后获取与Int值匹配的构造函数。