我编写了以下函数..并使用 WinHugs 执行
teneven = [x | x <- [1..10], even x]
我的输出:
Main> teneven
[2,4,6,8,10] :: [Integer]
(63 reductions, 102 cells)
反正有没有打印所有的减少..所以我可以了解 WinHugs 内部发生的核心评估?
我编写了以下函数..并使用 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]
那里有 lambda even
。此外,如果您愿意,Hat 可以跟踪调用 offoldr
和其他内部调用;默认情况下,它不会那样做。
这里有几个使用 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 打印所有减少。