Sono abbastanza nuovo per Haskell anche se ho fatto qualche ML molte lune fa.
Sto provando a creare un mazzo di carte da gioco, mischiarle e poi distribuirle. Ho il mazzo e lo shuffle ordinati (di moda) ma non sono sicuro di cosa farò dopo.
Questo è quello che ho finora:
import System.Random
import Data.Array.IO
import Control.Monad
-- | Randomly shuffle a list
-- /O(N)/
shuffle :: [a] -> IO [a]
shuffle xs = do
ar <- newArray n xs
forM [1..n] $ \i -> do
j <- randomRIO (i,n)
vi <- readArray ar i
vj <- readArray ar j
writeArray ar j vi
return vj
where
n = length xs
newArray :: Int -> [a] -> IO (IOArray Int a)
newArray n xs = newListArray (1,n) xs
ranks=[2..14]
suits=[1,2,3,4]
cards=[(r,s) | r <- ranks, s<- suits]
deck=shuffle cards
myAction :: IO [(Integer, Integer)]
myAction = shuffle cards
main :: IO ()
main = do
xs <- myAction
print xs
Non c'era una ragione particolare per cui ho scelto quel list shuffler oltre al motivo per cui potevo interrogare (o almeno visualizzare) la lista risultante.
Mi piacerebbe essere in grado di estrarre gli elementi dal IO [(Integer, Integer)] restituito, ma non sono del tutto sicuro su come procedere. Capisco che non posso semplicemente convertirlo in una lista di vaniglia (questo è coperto sufficientemente altrove), quindi presumibilmente ho bisogno di:
- estendi l'IO (monad?) in qualche modo
- scrivi un elenco personalizzato di tuples shuffler
- scrivi la mia monade
- usa un altro metodo che non ho ancora imparato
Aneddoticamente, credo che questo possa essere fatto "non pulito" ma non voglio andare al programmatore dell'inferno finché non capisco quanto sono caldi gli incendi ...
Qualche idea sul modo migliore di procedere?