можно ли распечатать все сокращения в Haskell, используя WinHugs?

StackOverflow https://stackoverflow.com/questions/416956

Вопрос

Я написал следующую функцию..и выполняется с помощью WinHugs

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

Мой результат:

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

есть ли возможность распечатать все сокращения..чтобы я мог изучить основную оценку, происходящую внутри WinHugs?

Это было полезно?

Решение

Некоторые идеи:

<Ол>
  • Опция командной строки отладки (которую вы можете установить с помощью : set + d в Hugs) информативна, но очень многословна и не показывает сокращения в синтаксисе Haskell.

  • Попробуйте Hat - Haskell Tracer . Я просто попробовал это на простой программе, и это довольно круто. Я не на Windows, хотя, и я не знаю, насколько сложно было бы запустить его. Скорее всего, это довольно сложно, и это позор, потому что это круто и по сути то, что вы хотите. Если вы его запустите, вы можете получить что-то вроде этой информации из 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]
    

    Лямбда есть даже . Также, если вы хотите, Hat может отслеживать вызовы foldr и другие внутренние вызовы; по умолчанию этого не происходит.

  • Другие советы

    Здесь у вас есть несколько примеров использования Debug.Trace и 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))
    

    Надеюсь, это поможет вам понять, как распечатать все сокращения с помощью WinHungs.

    Поверьте, вам не захочется идти этим путем.

    Набор (и порядок) сокращений, используемых в каждом конкретном случае, будет зависеть от конкретной реализации языка (hugs может сделать это одним способом, ghci — другим способом, jhc — третьим и т.д.).

    Лучше почитайте что-нибудь об общих способах реализации компилятора/интерпретатора/виртуальной машины для функционального языка - например, машины SECD и т. д.

    Несколько ссылок:

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top