1
6
拿着我的啤酒。
在运行它之前,花一秒钟时间预测它将输出什么。然后去问你的GHC是否同意你的猜测。 清澈如泥? 在这个明显简化的例子中,您需要在这里画出的基本区别就在这里:
有一个单独的缓存概念
功能
缓存它的
输出
. 后者,简单地说,从来没有在GHC中完成过(不过,请参阅下面关于优化版本的讨论)。前者听起来可能很蠢,但实际上并不像你想象的那么蠢;你可以想象写一个函数,比如,
一旦理解了这个基本事实,您必须相信的下一个飞跃是,在GHC中,类型类约束被编译为函数。(函数的参数是typeclass字典,说明每个typeclass的方法的行为。)ghc本身为您管理构造和传递这些字典,在大多数情况下,它对用户是透明的。 但这种编译策略的结果是: 多态的 但是typeclass约束的类型是一个函数 即使里面没有功能箭头 . 也就是说,
看起来像是一个普通的旧值;但实际上它是一个
功能
这需要一个
这只留下了一个问题,为什么优化会改变您的情况。在这里,我相信所发生的事情被称为“专门化”,在这种专门化中,编译器将尝试注意到多态性的东西何时被用于静态的已知单态类型,并为此进行绑定。就像这样:
在最后一个例子中,函数ness消失了;它“好像”ghc缓存了
|
2
1
自从
因为这是类型的值
注意,无论编译器优化是打开还是关闭,前者都不会被缓存。
当他们都是
如果您使用优化来编译更大的系统,并且它在某些度量上效率低下,我会怀疑问题就在其他地方。 |
trpnd · 如何定义由两个任意单声道变压器组成的单声道变压器? 2 年前 |
Fabus1184 · Haskell mapM_不打印 2 年前 |
Gotthold · 基于范数约束向量的类型 2 年前 |
jian · haskell将另一个函数用作输入参数 2 年前 |
Jocafrei · 用Haskell函数实现最大公约数函数 6 年前 |