• [^] # Re: Autre petit problème

    Posté par (site web personnel) . En réponse au message Haskell. Évalué à 3.

    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


    Ensuite,
    ghc --make toto.hs
    ./toto 1 3 90

    Et voilà !