我们都知道(或应该知道)Haskell默认是懒惰的。在必须评估之前,不会评估任何内容。那么什么时候必须对某些东西进行评估?在某些方面,Haskell必须严格。我称这些为“严格点”,尽管这个特定术语没有我想象的那么广泛。据我说:
Haskell中的减少(或评估) 仅在严格点进行。
所以,问题是:什么,准确地说,是Haskell的严格点?我的直觉说main
,seq
/爆炸模式,模式匹配以及IO
通过执行的任何操作main
都是主要的严格要求,但是我真的不知道为什么知道这一点。
(另外,如果他们不叫“严点”,什么是他们叫什么名字?)
我想一个很好的答案将包括有关WHNF的一些讨论。我也想像它可能会影响lambda演算。
编辑:关于此问题的其他想法。
正如我对这个问题的思考一样,我认为在严格性点的定义中添加一些内容会更加清晰。严格点可以具有变化的上下文和变化的深度(或严格性)。回到我的定义“ Haskell的减少仅在严格性点发生”,让我们在该定义中添加以下条款:“严格性点仅在评估或减少其周围上下文时触发。”
因此,让我尝试让您开始我想要的答案。main
是严格的一点。它被专门指定为上下文的主要严格要点:程序。在main
评估程序(的上下文)时,将激活main的严格点。Main的深度最大:必须对其进行充分评估。Main通常由IO操作组成,这些操作也是严格意义上的要点,其上下文是main
。
现在您尝试:seq
用这些术语讨论和模式匹配。解释功能应用的细微差别:它有多严格?怎么不行 那deepseq
呢 let
和case
陈述?unsafePerformIO
?Debug.Trace
?顶级定义?严格的数据类型?爆炸图案?等等,仅用seq或模式匹配就可以描述其中的多少项?
seq
和模式匹配就足够了,其余的都是根据这些定义的。例如,我认为模式匹配可确保IO
动作的严格限制。