任何“可视化”thunk / function的方法?或者如何查看一般参数的函数

时间:2013-05-27 05:49:51

标签: function haskell

我不完全确定如何问这个问题,但有没有办法显示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
%)

3 个答案:

答案 0 :(得分:9)

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

请参阅package on hackageHomepage(其中包含相当令人印象深刻的示例)。

答案 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))))))