Можно ли напечатать все сокращения в Haskell - используя WinHugs? - PullRequest
6 голосов
/ 06 января 2009

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

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

Мой вывод:

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

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

Ответы [ 3 ]

5 голосов
/ 16 февраля 2009

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

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

  2. Попробуйте Шляпа - 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]
    

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

5 голосов
/ 10 мая 2009

Вот несколько примеров использования 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.

2 голосов
/ 07 января 2009

Поверьте, вы не хотите идти по этому пути.

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

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

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

...