为了教育和学习目的,打印出Haskell的求值(重写)步骤。这是否可能?

21

我将通过使用书中的一个示例来描述这个问题。

在Simon Thompson的书 "HASKELL the craft of functional programming" 的第82页(见下图)中展示了fac 4的求值步骤。

问题:

是否有一些工具或"Haskell调试器"可以写出GHCi在评估fac 4时使用的求值步骤?

最好是以人类可读的格式,用于教育和学习目的。

还有一些自动解释每个求值步骤的说明,例如在重写步骤中使用了哪个方程式。

我的主要目的是深入了解在运行简单的教育Haskell示例程序(如fac)时如何进行重写步骤。

有什么办法吗?如果有,怎么做?

enter image description here

enter image description here


simple-reflect 可以做一些这样的事情。但虽然它对于简单的东西如列表和映射很有用,但它并不适用于所有情况。 - genisage
3个回答

12
是和不是。我还没有看到一个工具能够像你的教科书中描述的那样逐行评估 - 主要是因为Haskell程序不会对表达式进行“重写”。但是,有一个工具可以逐步可视化Haskell的实际评估策略:ghc-vis。它不像ghci一样只评估结果并在控制台上显示,而是显示未评估结果的图形表示 - 你可以强制逐个thunk地评估它,直到到达原始值和结构。作为它所能做的一个例子,这里是无限斐波那契序列的前三个列表成员的评估:

0, 1 and 1 are evaluated, the rest of the list is a thunk referring back to parts of the list itself

来源:项目网站的示例部分。你应该看看它们中的所有内容!


它能处理完整的Haskell吗?例如包括类型类和单子?我很想看到Brian Beckman视频讲座中状态单子如何工作的可视化。 - jhegedus
这可能比看重写步骤更具有教育意义! - jhegedus
更具体地说,Brian Beckman 的视频讲座在这里:http://channel9.msdn.com/Shows/Going+Deep/Brian-Beckman-The-Zen-of-Expressing-State-The-State-Monad)。 - jhegedus
是的,它可以处理任意的Haskell结构。我认为它们不会因为特定数据结构是某个类型类的实例而显示出不同的样子,但我自己还没有尝试过。 - Bergi

11

有一个名为 Lambda bubble pop 的工具,可以点击表达式以查看表达式如何被简化。请注意,该工具目前仅支持整数和列表,但仍然是一个很好的教育工具。

工具运行快照:

enter image description here


看起来很有趣。这个支持类型类吗?单子?代数数据类型?但似乎会在Safari上崩溃。 - jhegedus
嗯,看起来这些更高级的概念还没有被实现。 - jhegedus

3

这是一个备受请求且非常有用的功能,据我所知,在任何地方都找不到。:(


9
“能做到这个吗?”“不行。”那么这怎么不算回答问题呢? - MathematicalOrchid
3
当然可以做到这一点。我不知道有什么现成的工具能够满足我的要求,但你完全可以自己编写一个。 - genisage
1
完全没有理由为什么这样的工具不能存在 - 我真的希望有人能写一个! - MathematicalOrchid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接