我不完全确定如何问这个问题,但有没有办法显示thunk的结构?
例如
f x = x + 2
g x = 3 x
compo x = f (g x)
ans = compo 5
-- result: (3 * 5) + 2 = 17
有什么方法可以“看到”ans
的thunk?就像在,我可以看到compo
或类似“一般”形式的β减少过程。
我想看看,例如:
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
%)
答案 0 :(得分:9)
hackage上有 ghc-vis 包,它显示了您的堆和未评估的thunk的可视化。
请参阅package on hackage或Homepage(其中包含相当令人印象深刻的示例)。
答案 1 :(得分:3)
如果您只想查看缩减序列,可以尝试使用GHCi交互式调试器。 (它在某个地方的GHC手册中。)它不像典型的IDE调试器那么简单,但它或多或少都有效......
答案 2 :(得分: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))))))