2

我正在尝试编写一个函数,从所有可以选择的卡片中随机选择一张卡片。这些卡是我声明为等级的类型。我的代码如下所示:

data Rank = Ace | Two | Three | Four | Five | Six | Seven | Eight | Nine | Ten
            | Jack | Queen | King
            deriving(Eq, Ord, Bounded, Enum, Show, Read)

pickCard :: Rank
pickCard = error "How should I pick a random card here? :("

当然我希望这个函数做的是从列表中选择一个随机值[Ace .. King]我该怎么做?请记住,我是 Haskell 和函数式编程的初学者。

4

1 回答 1

5

在 Haskell 中,函数是引用透明的,这意味着如果你把同样的东西放到一个函数中,你会得到同样的东西。所以没有像

random :: () -> Int

每次使用它都会返回不同的结果。有几种方法可以解决这个问题,最简单的方法是使用现有的随机性设施。

import System.Random -- requires the random package from Hackage

instance Random Rank where -- Describes how to choose random card
  randomR (a,b) = over toEnum . randomR (fromEnum a, fromEnum b)
    where over f (a, b) = (f a, b)
  random = randomR (minBound, maxBound)

pickCard :: IO Rank
pickCard = randomIO

-- Or we can pass in a source of randomness and pass out the new one
pickCard :: RandomGen g => g -> (Rank, g)
pickCard = random
于 2013-10-31T14:13:13.420 回答