说我有一个类型如:
data Cell = Empty | Full
Haskell是否提供了一种简单的方法来不确定地调用这些构造函数中的一个或另一个?基本上我试图随机化调用哪个构造函数,例如[CellOfSomeType | i <- [1..somerange]]
答案 0 :(得分:3)
只需得到一个随机位,然后根据该位将值设置为Full
或Empty
。例如:
import System.Random
您似乎在谈论System.Random
,但此类信息应该包含在问题中。
data Cell = Full | Empty
deriving (Eq,Ord,Show,Enum)
我派生Enum
用于远程randoms。现在我们将为Random
类定义一个实例,这样您就可以使用几个公共库来生成类型为Cell
的随机值。 Random
课程要求我们至少定义random
和randomR
方法。
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
相同,我们只能生成一个随机bool(一点点)并选择你的两个构造函数中的一个。远程randoms更令人讨厌,但我们只是在请求的下限和上限之间生成一个Int,然后获取匹配该Int值的构造函数。