代码之家  ›  专栏  ›  技术社区  ›  ynn

Haskell中“seq”的源代码级定义

  •  1
  • ynn  · 技术社区  · 3 年前

    我正在努力理解 seq 在哈斯克尔。我对 seq 用英语,所以现在我想阅读它的实现。

    然而 the source code

    infixr 0 `seq`
    seq :: a -> b -> b
    seq = seq
    

    我该怎么读?这是一个无限递归的定义吗?不过我怀疑不是。

    1 回复  |  直到 3 年前
        1
  •  4
  •   David Young    3 年前

    seq 无法在普通Haskell中实现。这是一个“假人”的定义。它被实际的 seq GHC的行为。所以的真正实现(可以这么说) seq 在编译器内部。

    换句话说:如果我们忽略该代码片段中函数的名称,则该定义与 seq 。编译器看到名称“ seq “(也许它是在特定模块中定义的;我不确定细节),这告诉它用实际模块取代定义 seq 编译期间的行为。

        2
  •  3
  •   chi    3 年前

    链接的文件以开头

    {-这是一个生成的文件(由genprimocode生成)。它不是 实际使用的代码。它的唯一目的是被 黑线鳕。-}

    因此,它的生成只是为了使它能够反过来生成文档。

    文件中的每一个定义都是通过伪递归给出的 x = x 。这不是真正的定义,只是一个占位符。

    Haskell的基元在 GHC.Prim 喜欢 seq 不能简单地在Haskell模块中实现(否则它们将不会被调用 基元 ).相反,它们在编译过程中以一种特殊的方式进行处理。

    推荐文章