• [^] # Re: Fibo

    Posté par (site web personnel) . En réponse à la dépêche Sortie du Glorious Haskell Compiler 7.8. Évalué à 10.

    Le problème avec la mémoïsation automatique est de déterminer quand la faire. Il y a un compromis à trouver entre la vitesse d'exécution et l'espace mémoire (comme d'hab), pour quelles fonctions, selon quels paramètres en entrée, etc.

    La version avec l'utilisation d'une liste infinie doit normalement éviter de calculer plusieurs fois le même élement et le garbage collector se charge de supprimer les éléments au début de la liste qui ne sont plus nécessaires.

    Pour ton exemple C++, outre le fait qu'il manque des "::result", tu as conscience que c'est exécuté à la compilation et donc je suis moyennement surpris qu'afficher une constante soit efficace à l'exécution.

    Après l'exemple de la suite de Fibonacci n'est pas terrible puisque personne ne se sert d'Haskell pour calculer ça. Il y a tellement de choses plus intéressantes. Quelques exemples :

    1) Happstack (ou Yesod) pour intégrer un serveur web en quelques lignes dans une appli. L'analyse de l'url est type-safe, avec les modules de génération de HTML (comme blaze-html) on génère forcément des pages well-formed (vérifié statiquement par le système de types), en étant sûrs de ne renvoyer de façon non intentionnelle de chaînes de caractères qui ne soient pas converties en HTML ("échappées"), etc.

    2) Intégration de la mémoire transactionnelle. Pas besoin de se prendre la tête à gérer des mutexes ou autres. L'exemple classique du transfert d'argent entre 2 comptes :

    transfertPognon a b somme = atomically $ do
     courantA <- readTVar a
     when (courantA < somme) retry
     courantB <- readTVar b
     writeTVar a (courantA - somme)
     writeTVar b (courantB + somme)

    Le gros avantage c'est que c'est composable (pas besoin de prendre de mutexes dans l'ordre, etc.).

    3) QuickCheck pour tester automatiquement des fonctions en fonction de leurs types. Par exemple si vous écrivez une fonction de tri de caractères et que vous vouliez voir si elle a l'air conforme à un tri classique :

    let myCompare x y = case (x,y) of { ('a','b') -> GT; _ -> compare x y }
     mySort = sortBy myCompare
    ghci> quickCheck ((\s -> sort s == mySort s) :: String -> Bool)
    *** Failed! Falsifiable (after 52 tests and 9 shrinks): 
    "ab"

    Je vous invite à découvrir Haskell si ça n'est pas déjà fait. L'apprentissage est peut-être un peu difficile mais ça en vaut la peine.