List Data.Random.Extras用法

List Data.Random.Extras用法,list,haskell,random,shuffle,List,Haskell,Random,Shuffle,我正在尝试使用我创建的卡列表上的Data.Random.Extras包中的shuffle函数。我的代码: module Cards where import Data.Random.Extras data Suit = Clubs | Diamonds | Hearts | Spades deriving (Eq,Enum,Ord,Show,Bounded) data Value =

我正在尝试使用我创建的卡列表上的Data.Random.Extras包中的shuffle函数。我的代码:

module Cards where

import Data.Random.Extras

data Suit = Clubs
             | Diamonds
             | Hearts
             | Spades
               deriving (Eq,Enum,Ord,Show,Bounded)

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

data Card = Card Value Suit
                deriving (Eq,Ord,Show)

type Deck = [Card]

-- Generate deck of cards
generateDeck :: Deck
generateDeck = [Card val suit | suit <- [Clubs .. Spades], val <- [Two .. Ace]]

-- Print deck of cards
printDeck :: Deck -> IO ()
printDeck deck = putStr (formatDeck deck)
  where
    formatDeck [] = []
    formatDeck (x:xs) = (show x) ++ "\n" ++ formatDeck xs
我花了几个小时寻找并试图解决/理解这个问题,但没有成功。我非常感谢你的帮助


谢谢。

这是因为
随机播放的类型是
[a]->RVar[a]
。所以你不会得到一个你可以直接使用的
[a]
,而是一些神秘的
RVar
RVar
有点像
IO
,因为
RVar a
不是
a
类型的值,而是获取
a
类型的值的更多的平均值。为了实际获得
a
类型的值,必须使用
runRVar::RandomSource ms=>RVar a->s->ma
。查看的文档,它有多个实例。一个例子是
MonadRandom=>RandomSource m StdRandom
。因此我们可以像这样使用
runRVar
(因为
IO
MonadRandom
的一个实例):

或者另一个不涉及
IO的
MonadRandom
实例将是
状态StdGen a

> -- Above imports and
> import Control.Monad.State (State,evalState)
> import System.Random (StdGen,mkStdGen)
> shuffledState = runRVar (shuffle [1..10]) StdRandom :: State StdGen [Int]
> evalState shuffledState $ mkStdGen 0 -- 0 is the seed
[6,8,7,5,10,9,2,3,1,4]
> import Data.Random (runRVar, StdRandom(..))
> import Data.Random.Extras (shuffle)
> runRVar (shuffle [1..10]) StdRandom :: IO [Int]
[3,10,8,5,6,7,4,2,9,1]
> -- Above imports and
> import Control.Monad.State (State,evalState)
> import System.Random (StdGen,mkStdGen)
> shuffledState = runRVar (shuffle [1..10]) StdRandom :: State StdGen [Int]
> evalState shuffledState $ mkStdGen 0 -- 0 is the seed
[6,8,7,5,10,9,2,3,1,4]