那么,什么时候必须对某些事情进行评估呢?有些地方Haskell必须严格要求。我称这些为“严格点”,尽管这个术语并不像我想象的那样普遍。据我说:
Haskell的缩减(或评估)只发生在严格点。
我的直觉说main
,seq
/bang模式、模式匹配以及任何IO
通过main
是最主要的严格点,但我不知道为什么我知道。
编辑:关于这个问题的其他想法。
正如我在这个问题上的思考,我认为在严格点的定义中增加一些东西会更清楚一些。严格点可能有变化语境变化多端深度(或严格)回到我的定义,“Haskell中的缩减只发生在严格点”,让我们在这个定义中添加这个子句:“只有在评估或缩小其周围的上下文时,才会触发严格点。”
所以,让我试着让你开始寻找我想要的答案。main
是一个严格的点。它被特别指定为其上下文的主要严格点:程序。当程序(main
的上下文)被评估,主体的严格点被激活。Main的深度是最大的:必须对其进行充分的评估。main通常由IO操作组成,这些操作也是严格的点,其上下文是main
。
现在你试着:讨论seq
和模式匹配在这些术语中。解释功能应用的细微差别:它是如何严格的?怎么可能不呢?那...deepseq
?let
和case
口供?unsafePerformIO
?Debug.Trace
?高层定义?严格的数据类型?爆炸模式?等等。这些项目中有多少可以用seq或模式匹配来描述?
发布于 2018-04-17 08:53:34
这将告诉你什么时候用类似于GHC的Core的小语言来计算表达式。然后剩下的问题是如何将完整的Haskell映射到Core,大部分翻译都是由Haskell Report自己提供的。在GHC中,我们称之为“desugling”,因为它去掉了语法糖。
好吧,这并不是全部,因为GHC包含了一系列在去标记和代码生成之间的优化,许多这些转换将重新安排Core,以便在不同的时间对事情进行评估(特别是严格性分析将导致事情得到更早的评估)。你的程序将被评估,你需要看看核心产生的GHC。
也许这个答案在你看来有点抽象(我没有特别提到邦模式或seq),但你要求的是什么。精确这是我们所能做的最好的。
发布于 2018-04-17 09:22:27
首先,我们可以如下所示:
从直观的列表中,main和IO操作属于第一类,seq和模式匹配属于第二类。但是我认为第一类更符合你关于“严格点”的观点,因为事实上,这就是我们在哈斯克尔所做的评价的结果。可见性对用户的影响。
给出所有的细节是一项很大的任务,因为Haskell是一门很大的语言。它也很微妙,因为并发Haskell可能会投机性地评估事物,即使我们最终没有使用结果:这是导致评估的第三种事情。第二类是很好的研究:想看看严格性所涉及的职能。第一类也可以被认为是一种“严格性”,尽管这有点诡异,因为evaluate x
和seq x $ return ()
其实是不同的东西!如果将某种语义提供给IO Monad(显式传递RealWorld#
令牌适用于简单情况),但我不知道这种分层严格性分析一般是否有名称。
https://stackoverflow.com/questions/-100003275
复制相似问题