T'as pas compris. Haskell, c'est pas Lisp. L'interprète ghci a une sémantique pourrie, donc tant que tu ne fais pas un fichier à compiler avec un MAIN, tu ne comprendras jamais comment ça marche.
Haskell, c'est un mensonge. On te dit "c'est pur, mais on peut faire des effets de bord dans la monade IO". La vérité, c'est que tu dois TOUT faire dans la monade IO. Tu dois TOUT faire à partir de la fonction main. Donc tu peux TOUJOURS extraire tes données avec l'opérateur "<-"
Désormais, tu coderas dans un fichier, avec un main, et tu feras ":!ghci %" ou l'équivalent pour emacs. Et tu lanceras "main" dans ton interprète, si ça type.
En pratique, une dernière fois (après, je moinsse !)
import Random (randomRIO)
import System (getArgs)
data Mobile = Poids Rational | Branche Rational Mobile Mobile deriving Show
poids :: Mobile -> Rational
poids (Poids n) = n
poids (Branche _ g d) = poids g + poids d
shuffle' [] acc = return acc
shuffle' l acc = do
k <- randomRIO (0, length l - 1)
let (lead, x:xs) = splitAt k l
shuffle' (lead ++ xs) (x:acc)
shuffle :: [a] -> IO [a]
shuffle l = shuffle' l []
splity :: [a] -> ([a],[a])
splity x = splitAt n x where
n = div (length x) 2
ranCreation :: [Rational] -> Mobile
ranCreation [] = (Poids 0)
ranCreation [p] = (Poids p)
ranCreation li = Branche k (ranCreation x) (ranCreation y) where
m = splity li
x = fst m
y = snd m
k = (poids (ranCreation y))/(poids (ranCreation x) + (poids (ranCreation y)))
main = do
liste <- getArgs
let liste_nombres = (map (fromIntegral . read) liste)
let arbre1 = ranCreation liste_nombres
liste_nombres_randomisee <- shuffle liste_nombres -- ICI !!!!
let arbre2 = ranCreation $ liste_nombres_randomisee -- LA !!!!
print arbre1
print arbre2
[^] # Re: Autre petit problème
Posté par Axioplase ıɥs∀ (site web personnel) . En réponse au message Haskell. Évalué à 3.
Haskell, c'est un mensonge. On te dit "c'est pur, mais on peut faire des effets de bord dans la monade IO". La vérité, c'est que tu dois TOUT faire dans la monade IO. Tu dois TOUT faire à partir de la fonction main. Donc tu peux TOUJOURS extraire tes données avec l'opérateur "<-"
Désormais, tu coderas dans un fichier, avec un main, et tu feras ":!ghci %" ou l'équivalent pour emacs. Et tu lanceras "main" dans ton interprète, si ça type.
En pratique, une dernière fois (après, je moinsse !)
import Random (randomRIO)
import System (getArgs)
data Mobile = Poids Rational | Branche Rational Mobile Mobile deriving Show
poids :: Mobile -> Rational
poids (Poids n) = n
poids (Branche _ g d) = poids g + poids d
shuffle' [] acc = return acc
shuffle' l acc = do
k <- randomRIO (0, length l - 1)
let (lead, x:xs) = splitAt k l
shuffle' (lead ++ xs) (x:acc)
shuffle :: [a] -> IO [a]
shuffle l = shuffle' l []
splity :: [a] -> ([a],[a])
splity x = splitAt n x where
n = div (length x) 2
ranCreation :: [Rational] -> Mobile
ranCreation [] = (Poids 0)
ranCreation [p] = (Poids p)
ranCreation li = Branche k (ranCreation x) (ranCreation y) where
m = splity li
x = fst m
y = snd m
k = (poids (ranCreation y))/(poids (ranCreation x) + (poids (ranCreation y)))
main = do
liste <- getArgs
let liste_nombres = (map (fromIntegral . read) liste)
let arbre1 = ranCreation liste_nombres
liste_nombres_randomisee <- shuffle liste_nombres -- ICI !!!!
let arbre2 = ranCreation $ liste_nombres_randomisee -- LA !!!!
print arbre1
print arbre2
Ensuite,
ghc --make toto.hs
./toto 1 3 90
Et voilà !