Question

J'ai écrit la fonction suivante .. et exécuté avec WinHugs

teneven =  [x | x <- [1..10], even x]

Mon résultat:

Main> teneven
[2,4,6,8,10] :: [Integer] 
(63 reductions, 102 cells)

est-il possible d'imprimer toutes les réductions .. afin que je puisse connaître l'évaluation de base qui se passe dans WinHugs?

Était-ce utile?

La solution

Quelques idées:

  1. L'option de ligne de commande de débogage (que vous pouvez définir avec : set + d dans Hugs) est informative, mais elle est très détaillée et ne vous montre pas les réductions de syntaxe Haskell.

  2. Essayez Hat - le traqueur Haskell . Je viens de l'essayer sur un programme simple et c'est assez cool. Je ne suis pas sous Windows, cependant, et je ne sais pas à quel point il serait difficile de le faire fonctionner. C'est probablement assez difficile, ce qui est dommage car c'est cool et essentiellement ce que vous voulez. Si vous le faites fonctionner, vous pouvez obtenir quelque chose comme cette information de Hat:

    main = {IO}
    teneven = [2,4,6,8,10]
    _foldr (\..) [1,2,3,4,5,6,7,8, ...] [] = [2,4,6,8,10]
    (\..) 1 [2,4,6,8,10] = [2,4,6,8,10]
    (\..) 2 [4,6,8,10] = [2,4,6,8,10]
    (\..) 3 [4,6,8,10] = [4,6,8,10]
    (\..) 4 [6,8,10] = [4,6,8,10]
    (\..) 5 [6,8,10] = [6,8,10]
    (\..) 6 [8,10] = [6,8,10]
    (\..) 7 [8,10] = [8,10]
    (\..) 8 [10] = [8,10]
    (\..) 9 [10] = [10]
    (\..) 10 [] = [10]
    

    Le lambda il y a même . De plus, si vous le souhaitez, Hat peut suivre les appels de foldr et d’autres appels internes; par défaut, il ne le fait pas.

Autres conseils

Vous trouverez ici quelques exemples d'utilisation de Debug.Trace et Hugs.Observe.

import Debug.Trace
fact :: Integer -> Integer
fact 0 = trace "fact 0 ->> 1" 1
fact n = trace ("fact " ++ show n) (n * fact (n-1))


import Hugs.Observe
fact :: Integer -> Integer
fact 0 = observe "fact 0" 1
fact n = observe "fact n" (n *  fact (n-1))

J'espère que cela vous aidera à comprendre comment imprimer toutes les réductions à l'aide de WinHungs.

Croyez-moi, vous ne voulez pas y aller de cette façon.

L'ensemble (et l'ordre) des réductions utilisées dans chaque cas particulier dépendrait de la mise en œuvre linguistique particulière (les câlins pourraient le faire d'une manière, ghci - d'une autre manière, jhc - d'une autre, etc.).

Il vaut mieux lire quelque chose sur les méthodes générales pour implémenter un compilateur / interprète / une machine virtuelle pour un langage fonctionnel - comme une machine SECD, etc.

Plusieurs liens:

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top