hello matthew,<br><br>I commented your gist on github adding the missing pieces with minor fixes.<br><br>Anyway, I suggest giving up RVar&#39;s which are overkill for your task. You could implement your shuffle as an exercise, or use random-shuffle package as I do in the code below.<br>
<br>Also I&#39;d avoid State monad for such a simple task of remembering the remaining deck after each deal.  You should switch to using a monad after  you are comfortable with pure code.<br><br><br>import Control.Arrow<br>
import System.Random.Shuffle<br>import Control.Monad.Random.Class<br><br>-- |Cards.<br>data Suit = Hearts | Diamonds | Clubs | Spades deriving (Enum, Bounded, Show)<br><br>data Rank = Ace | Two | Three | Four | Five | Six | Seven | Eight | Nine | Ten | Jack | Queen | King deriving (Enum, Bounded, Show)<br>
<br>data Card = Flat Rank Suit | Jolly deriving Show<br><br>type Deck = [Card]<br>type Hand = [Card]<br><br>deck :: Deck<br>deck = [ Flat s r | s &lt;- [minBound .. maxBound] , r &lt;- [minBound .. maxBound]]++ [Jolly,Jolly]<br>
<br>-- deal n cards m times from the given deck and return the rest along the hands<br>dealHands :: Int -&gt; Int -&gt; Deck -&gt; ([Hand],Deck)<br>dealHands n m  = (map (take n) *** head) . splitAt m . iterate (drop n)<br>
 <br>-- same as dealHands, but shuffle the deck before<br>randomDealHands :: (Functor m, MonadRandom m) =&gt; Int -&gt; Int -&gt; Deck -&gt; m ([Hand],Deck)<br>randomDealHands n m xs = dealHands n m `fmap` shuffleM xs<br>
<br>test :: IO ([Hand],Deck)<br>test = randomDealHands 5 4 $ deck ++ deck<br><br>You can run randomDealHands in IO (ghci prompt) as IO is both a Functor and a MonadRandom instance<br><br>regards <br>paolino<br><div class="gmail_quote">
2012/8/25 Matthew <span dir="ltr">&lt;<a href="mailto:wonderzombie@gmail.com" target="_blank">wonderzombie@gmail.com</a>&gt;</span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
So I&#39;ve finally got some code which shuffles a deck of cards and deals<br>
out an arbitrary number of hands.<br>
<br>
<a href="https://gist.github.com/19916435df2b116e0edc" target="_blank">https://gist.github.com/19916435df2b116e0edc</a><br>
<br>
type DealerState = State [Card] [[Card]]<br>
<br>
deck :: [Card]<br>
deck = [ (s, r) | s &lt;- suits, r &lt;- ranks ]<br>
<br>
shuffleDeck :: Int -&gt; RVar [Card]<br>
shuffleDeck n = shuffle $ concat $ replicate n deck<br>
<br>
deal :: Int -&gt; ([[Card]] -&gt; DealerState)<br>
deal n = \xs -&gt; state $ \s -&gt; (xs ++ [take n s], drop n s)<br>
<br>
-- |Deal a number of hands a number of cards each.<br>
dealHands :: Int -&gt; Int -&gt; ([[Card]] -&gt; DealerState)<br>
dealHands hs cs = foldr1 (&lt;=&lt;) $ replicate hs (deal cs)<br>
<br>
First of all, I have no idea if this is any good. The way I end up<br>
calling dealHands and getting a &quot;real&quot; result is `runState (dealHands<br>
3 7 []) deck`. And I see that I&#39;ve got nested lambdas all in `deal`.<br>
But hey it took me forever to figure it out and it &quot;works.&quot;<br>
<br>
I&#39;m using `shuffle` from Data.Random.Extras, which results in an RVar,<br>
and thus the beginning of my perplexity. I&#39;m happy to end up with RVar<br>
inside a State monad, but I&#39;m not sure where to start. To be honest,<br>
I&#39;m only barely understanding what I&#39;m doing with the State monad as<br>
it is. :)<br>
<br>
Happy for any help whatsoever!<br>
<br>
- Matthew<br>
<br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
</blockquote></div><br>