можно ли распечатать все сокращения в Haskell, используя WinHugs?
-
03-07-2019 - |
Вопрос
Я написал следующую функцию..и выполняется с помощью 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 и т. д.
Несколько ссылок:
- Википедия, SECD-машина
- Лямбда Ultimate, Внедрение быстрых переводчиков