首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Data.Random.Extras使用

Data.Random.Extras使用
EN

Stack Overflow用户
提问于 2017-01-07 16:03:45
回答 1查看 240关注 0票数 1

我试图在我创建的卡片列表中使用Data.Random.Extras包中的洗牌函数。我的代码:

代码语言:javascript
复制
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

问题是,当我试图在提示符上执行generateDeck $ GHCi洗牌时,我得到的是:

代码语言:javascript
复制
No instance for (Show (Data.RVar.RVar [Card]))
  arising from use of 'print'
Possible fix:
  Add an instance declaration for (Show (Data.RVar.RVar [Card]))
In a stmt of an interactive GHCi command: print it

我花了几个小时的时间去寻找并试图解决/理解这个问题,但没有成功。我非常感谢你的帮助。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-07 16:37:14

这是因为shuffle的类型是[a] -> RVar [a]。所以你不会得到一个直接使用的[a],而是一些神秘的RVarRVar有点像IO,因为RVar a不是a类型的值,而是获得a类型值的更多手段。为了实际获得a类型的值,您必须使用runRVar :: RandomSource m s => RVar a -> s -> m a。查看RandomSource的文档,它有多个实例。MonadRandom m => RandomSource m StdRandom就是一个例子。所以我们可以这样使用runRVar (因为IOMonadRandom的一个实例):

代码语言:javascript
复制
> 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]

或者MonadRandom的另一个实例,不涉及IO的是State StdGen a

代码语言:javascript
复制
> -- 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]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41523394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档