在Haskell中是否存在完全应用的curried函数thunk?

时间:2015-09-11 15:55:17

标签: haskell

或换句话说:

我可以将所有参数应用于curried函数而不进行评估吗?所以我的函数值仍然是,而不是计算的结果?

示例:

add x y = x + y
add1 = add 3   {- add1 is a function -}
add2 = add1 4  {- add2 is 7, but I would like to have a function 
                  I can call with no arguments!? -}

原因是传递完全绑定的函数,可以在任意情况下调用,而无需提供额外的参数。

请不要欺骗(比如在呼叫站点提供伪造的最后一个参数,如1或True)。

1 个答案:

答案 0 :(得分:10)

函数总是带参数。没有参数的那个不是函数。这里唯一的小窍门是, Haskell 中的一些东西认为值在系统FC中是函数。例如7具有类型Num a => a,这意味着在Haskell中它是一个多态数字,但在系统FC中它是一个函数,它接受Num a字典并产生一个{ {1}}。所以你可以得到你所要求的东西。

然而,你所要求的似乎并不是你想要的!计算成本高的事实并不意味着你应该把它作为函数的结果

a

实际上并没有计算x = really expensive computation 。只有当您检查 x的值(通过模式匹配,或xseq等)时才会evaluate得到评估,即使这样,它也只在必要时进行评估。

注释:

  

好的,所以GHCi背叛了我,让我相信add1 4立即被评估为7,而在正常的程序运行中情况并非如此?!

都能跟得上!您在GHCi提示符下键入x。因此,GHCi得出结论,你希望add1 4这个价值。为了print一个数字,需要计算所有数字,并且需要首先计算数字本身!如果您想深入了解,可以使用GHCi的print:print命令,这些命令可以检查未评估或部分评估的内容。

:sprint

注意:懒洋洋地拖延事情可能会对性能造成不良影响。 GHC在编译代码中花了很大的篇幅来确定何时可以使它们严格而不影响程序的含义而不会导致其他性能问题。这个编译器传递称为"需求分析",它是"严格性分析的特定形式"。