Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function “有什么办法吗?”;“形象化”;砰的一声/功能?或者如何查看常规参数的函数_Function_Haskell - Fatal编程技术网

Function “有什么办法吗?”;“形象化”;砰的一声/功能?或者如何查看常规参数的函数

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 例如

我不知道该怎么问这个问题,但有没有一种方法可以展示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

例如,在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))))))