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

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

我的输出:

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

无论如何,有没有打印所有的减少..这样我就可以了解 WinHugs 内部发生的核心评估?

有帮助吗?

解决方案

一些想法:

  1. debug命令行选项(您可以在Hugs中使用:set + d 设置)是提供信息的,但是非常详细,并没有向您显示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有甚至。此外,如果您愿意,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 机等。

几个链接:

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top