Haskell:获得另一种类型

时间:2017-03-11 00:49:28

标签: haskell

说我有一个类型如:

data Cell = Empty | Full

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

1 个答案:

答案 0 :(得分:3)

只需得到一个随机位,然后根据该位将值设置为FullEmpty。例如:

import System.Random

您似乎在谈论System.Random,但此类信息应该包含在问题中。

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

我派生Enum用于远程randoms。现在我们将为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相同,我们只能生成一个随机bool(一点点)并选择你的两个构造函数中的一个。远程randoms更令人讨厌,但我们只是在请求的下限和上限之间生成一个Int,然后获取匹配该Int值的构造函数。