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 に答える