7

我不完全确定如何问这个问题,但有没有办法显示 thunk 的结构?

例如

f x = x + 2
g x = 3 x

compo x = f (g x)

ans = compo 5
-- result: (3 * 5) + 2 = 17

有什么办法可以“看到” thunkans吗?compo如中,我可以看到或喜欢“一般”形式的 beta 减少过程。

我想看看,例如:

compo n
--> (3 * n) + 2

如,如果我有一个函数compo x,我想查看它被分解为(3*n)+2.

例如,在 Mathematica 中:

f[x_] := x+2;
g[x_] := 3*x;
compo[x_] := f[g[x]];

compo[n]
(%
  --> (3 * n) + 2
%)
4

3 回答 3

9

hackage 上有ghc-vis包,它显示了你的堆和未评估的 thunk 的可视化。

请参阅hackage主页上的包(其中包含相当令人印象深刻的示例)。

于 2013-05-27T11:42:53.287 回答
3

如果您只想查看减少的顺序,可以尝试使用 GHCi 交互式调试器。(它在 GHC 手册中的某个地方。)它不像典型的 IDE 调试器那么简单,但它或多或少可以工作......

于 2013-05-27T08:44:44.690 回答
1

一般来说(我们在谈论Haskell代码)我认为它没有意义,最终的thunk流对于不同的输入数据会有所不同,另一方面,函数被部分扩展(函数不仅仅是简单的表达式)。

无论如何,你可以模拟它(但丑陋)

Prelude> :set -XQuasiQuotes
Prelude> :set -XTemplateHaskell
Prelude> import Language.Haskell.TH
Prelude> import Language.Haskell.TH.Quote
Prelude> runQ [| $([|\x -> 3 * x|]) . $([|\y -> y + 2|]) |]
InfixE (Just (LamE [VarP x_0] (InfixE (Just (LitE (IntegerL 3))) (VarE GHC.Num.*) (Just (VarE x_0))))) (VarE GHC.Base..) (Just (LamE [VarP y_1] (InfixE (Just (VarE y_1)) (VarE GHC.Num.+) (Just (LitE (IntegerL 2))))))
于 2013-05-27T07:54:25.897 回答