6

我编写了以下函数..并使用 WinHugs 执行

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

我的输出:

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

反正有没有打印所有的减少..所以我可以了解 WinHugs 内部发生的核心评估?

4

3 回答 3

5

一些想法:

  1. 调试命令行选项(您可以:set +d在 Hugs 中设置)提供信息,但非常冗长,并且没有显示 Haskell 语法的简化。

  2. 试试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和其他内部调用;默认情况下,它不会那样做。

于 2009-02-16T20:03:26.840 回答
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 打印所有减少。

于 2009-05-09T21:39:41.657 回答
2

相信我,你不想走这条路。

在每种特定情况下使用的减少集合(和顺序)将取决于特定的语言实现(拥抱可以用一种方式,ghci - 以另一种方式,jhc - 以另一种方式,等等)。

最好阅读一些关于为功能语言实现编译器/解释器/虚拟机的一般方法 - 例如 SECD 机器等。

几个链接:

于 2009-01-07T15:26:47.090 回答