我编写了以下函数..并使用WinHugs
执行teneven = [x | x <- [1..10], even x]
我的输出:
Main> teneven
[2,4,6,8,10] :: [Integer]
(63 reductions, 102 cells)
无论如何打印所有减少..所以我可以学习WinHugs内部的核心评估?
答案 0 :(得分:5)
一些想法:
debug命令行选项(您可以在Hugs中使用:set +d
设置)是提供信息的,但是非常详细,并没有向您显示Haskell语法的减少。
尝试Hat - the 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]
lambda有even
。此外,如果您愿意,Hat可以追踪foldr
和其他内部呼叫的呼叫;默认情况下,它不会这样做。
答案 1 :(得分:5)
这里有几个使用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 :(得分:2)
相信我,你不想这样走。
在每个特定情况下使用的减少量的设置(和顺序)将取决于特定的语言实现(拥抱可以单向执行,ghci - 换句话说,jhc - 在另一个中,等等)。
更好地阅读有关为函数式语言实现编译器/解释器/虚拟机的一般方法的一些内容 - 如SECD机器等。
几个链接: