Haskell中seq的源码定义解析:为何是seq=seq?
解读GHC源码中
seq的特殊定义 你看到的这段代码并不是真的无限递归,而是GHC对原语(primitive)函数的特殊写法,原因如下:
首先明确:
seq是Haskell的底层原语,它的实际实现根本不是用Haskell代码写的,而是嵌入在GHC编译器内部(用C/汇编这类底层语言实现)。你在GHC.Prim里看到的代码只是个占位符。那段代码的作用只有两个:
- 给
seq声明类型签名a -> b -> b,让Haskell的类型检查器能正常工作; - 定义它的运算符优先级
infixr 0,确保它在表达式里的求值顺序符合预期。
- 给
至于
seq = seq这行,只是因为Haskell语法要求函数必须有定义,但原语函数没法用纯Haskell写出逻辑,所以就用这种形式占位置——编译器会直接忽略这个“递归定义”,转而调用内部硬编码的seq实现:强制第一个参数求值到弱头范式(WHNF),然后返回第二个参数。不止
seq,很多GHC的底层原语(比如unsafeCoerce、undefined的底层版本)都是用这种占位符方式写在Haskell源码里,实际逻辑由编译器直接处理,不会触发递归求值。
内容的提问来源于stack exchange,提问作者ynn
相关产品推荐
相关产品推荐

