List Data.Random.Extras用法
我正在尝试使用我创建的卡列表上的Data.Random.Extras包中的shuffle函数。我的代码: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 =
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]