Function “有什么办法吗?”;“形象化”;砰的一声/功能?或者如何查看常规参数的函数
我不知道该怎么问这个问题,但有没有一种方法可以展示thunk的结构 比如说Function “有什么办法吗?”;“形象化”;砰的一声/功能?或者如何查看常规参数的函数,function,haskell,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的声音?如中所示,我可以看到compo或类似“通用”形式的beta减少过程 例如,我希望看到: compo n --> (3 * n) + 2 如中所示,如果我有一个函数compox,我想将其分解为(3*n)+2 例如
f x = x + 2
g x = 3 x
compo x = f (g x)
ans = compo 5
-- result: (3 * 5) + 2 = 17
有没有办法让我“看到”ans的声音?如中所示,我可以看到compo
或类似“通用”形式的beta减少过程
例如,我希望看到:
compo n
--> (3 * n) + 2
如中所示,如果我有一个函数compox
,我想将其分解为(3*n)+2
例如,在Mathematica中:
f[x_] := x+2;
g[x_] := 3*x;
compo[x_] := f[g[x]];
compo[n]
(%
--> (3 * n) + 2
%)
一般来说(我们谈论的是Haskell代码),我认为它没有意义,最终的thunk流对于不同的输入数据将是不同的,另一方面,函数被部分扩展(函数不仅仅是简单的表达式)
无论如何,你可以模拟它(但很难看)
如果您只想查看减少的顺序,可以尝试使用GHCi交互式调试器。(它在GHC手册的某个地方。)这几乎不像典型的IDE调试器那么简单,但它或多或少可以工作…在hackage上有一个GHC vis包,它显示了堆和未评估的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))))))