Haskell:为什么将辅助函数命名为“go”?

2024-04-20

I see go在阅读 Haskell 材料或源代码时,我经常会遇到这样的情况,但我从来没有真正感到舒服 - (我猜它在我的脑海中具有“goto”的负面含义)。我开始用 LYAH 学习 Haskell,这就是我开始使用 Haskell 的原因acc and step书写折叠时。写作约定在哪里go来自?

最重要的是,名字到底是什么go应该暗示?


唔!一些考古学!

大约从 2004 年开始我就开始使用go作为尾递归工作循环的通用名称,在对递归函数进行工作/包装转换时。我开始广泛使用它bytestring, e.g.

foldr :: (Word8 -> a -> a) -> a -> ByteString -> a
foldr k v (PS x s l) = inlinePerformIO $ withForeignPtr x $ \ptr ->
        go v (ptr `plusPtr` (s+l-1)) (ptr `plusPtr` (s-1))
    where
        STRICT3(go)
        go z p q | p == q    = return z
                 | otherwise = do c  <- peek p
                                  go (c `k` z) (p `plusPtr` (-1)) q -- tail recursive
{-# INLINE foldr #-}

来自bytestring2005年8月。

这个写下来了in RWH http://book.realworldhaskell.org/read/profiling-and-optimization.html#id678845,并且可能是从那里开始流行的。还,在流融合中 http://hackage.haskell.org/packages/archive/stream-fusion/0.1.2.2/doc/html/src/Data-List-Stream.html#foldl1图书馆、邓肯·库茨和我开始经常这样做。

来自 GHC 来源

这个习语的历史可以追溯到更远的时候。foldr在 GHC.Base 中 http://www.haskell.org/ghc/docs/7.0.3/html/libraries/base-4.3.1.0/src/GHC-Base.html#foldr给出为:

foldr k z = go
      where
         go []     = z
         go (y:ys) = y `k` go ys

这可能就是我学到这个技巧的地方(我以为这是来自安迪·吉尔的论文,但找不到任何用途go那里)。它isn'tGofer 中以这种形式给出,所以我认为这首先出现在 GHC 代码库中。

到 2001 年,西蒙·马洛 (Simon Marlow) 使用go在一些系统级代码中,所以我们可能将责任归咎于 GHC 中的某个地方,这条线索引导我们GHC 来源 http://www.haskell.org/ghc/docs/6.12.2/html/libraries/ghc-6.12.2/src/CoreToStg.html#myCollectBinders, where go广泛应用于工作者函数:

myCollectBinders expr
  = go [] expr
  where
    go bs (Lam b e)          = go (b:bs) e
    go bs e@(Note (SCC _) _) = (reverse bs, e)
    go bs (Cast e _)         = go bs e
    go bs (Note _ e)         = go bs e
    go bs e                  = (reverse bs, e)

GHC 3.02 和格拉斯哥

挖掘GHC的旧版本,我们发现在GHC 0.29中这个习惯用法没有出现,但是到了GHC 3.02系列(1998),go成语随处出现。一个例子,在Numeric.lhs,在定义中showInt,日期为 1996 年至 1997 年:

showInt n r
  | n < 0     = error "Numeric.showInt: can't show negative numbers"
  | otherwise = go n r
    where
     go n r =
      case quotRem n 10 of                 { (n', d) ->
      case chr (ord_0 + fromIntegral d) of { C# c# -> -- stricter than necessary
      let
    r' = C# c# : r
      in
      if n' == 0 then r' else go n' r'
      }}

这是与之前不同的实现H98报告中给出 http://www.haskell.org/onlinereport/numeric.html。深入贯彻落实“数字.lhs” https://github.com/ghc/ghc/commits/master/ghc/lib/std/Numeric.lhs然而,我们发现它与 1997 年添加到 GHC 2.06 的版本并不相同,并且在 1998 年 4 月出现了来自 Sigbjorne Finne 的一个非常有趣的补丁,添加一个go循环到 Numeric.lhs。 https://github.com/ghc/ghc/commit/009527af27c8ee36a59db4d451e7c7a9896cb1da#ghc/lib/std/Numeric.lhs

这表明至少到 1998 年,Sigbjorne 才添加了go循环到 GHC“std”库,同时,许多GHC 编译器核心中的模块 https://github.com/ghc/ghc/blob/0065d5ab628975892cea1ec7303f968c3338cbe1/compiler/coreSyn/CoreSyn.lhs had go循环。进一步挖掘,这Will Parttain 在 1996 年 7 月的非常有趣的提交在 GHC 中添加了一个“go”循环 https://github.com/ghc/ghc/commit/12899612693163154531da3285ec99c1c8ca2226#L6R413

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Haskell:为什么将辅助函数命名为“go”? 的相关文章

随机推荐

  • 何时处置?

    我对所有有关 IDispose 和 使用 语句的讨论感到困惑 我想知道是否有人可以告诉我在下面的测试示例中是否需要使用 using 语句或 IDispose 的某种实现 public class Main MyFile myFile new
  • resharper 单元测试继承

    有人有 Resharper 单元测试层次结构的策略吗 我通常使用 TestDriven Net 和 Resharper 的测试运行器以及 NUnit 测试 TestDriven 对所有事情都很棒 但很快就会从批量运行 可能是数千个 中找到一
  • WordPress 博客文章未显示 Facebook 预览图像

    我有一篇博客文章here http gingerslist com blog 62 smiles and understanding 2 当我在 Facebook 上分享此内容时 预览图像不显示 我尝试过重新抓取Facebook 开发者工具
  • 使用 SQLAlchemy 批量更新插入 [重复]

    这个问题在这里已经有答案了 我正在使用 SQLAlchemy 1 1 0b 将大量数据批量插入到 PostgreSQL 中 并且遇到了重复的键错误 from sqlalchemy import from sqlalchemy orm imp
  • 何时应使用以下各项:Amazon EC2、Google App Engine、Microsoft Azure 和 Salesforce.com? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我是在非常普遍的意义上问这个问题 无论是从云提供商还是云消费者的角度来看 此外 问题不针对任何特定类型的应用程序 实际上 目的是了解哪种类型的应
  • 在 iPhone 中的应用程序中评价我在 iTunes 中的应用程序

    我必须在我的应用程序中提供一个链接 用户点击它就会将我带到应用程序的 itunes Appstore 页面 用户可以在其中对应用程序进行评分 我认为其他应用程序尝试访问设备中的Appstore应用程序并在itunes中传递该应用程序的相应u
  • PowerShell 5 中的写入主机与写入信息

    众所周知 Write Host是邪恶的 在PowerShell 5 Write Information被添加并被考虑替换Write Host 但是 说实话 哪个更好呢 Write Host是邪恶的 因为它不使用管道 因此输入消息无法被重用
  • 如何使用Android KeyStore安全存储任意字符串?

    我希望能够在 Android KeyStore 中安全地存储一些敏感字符串 我从服务器获取字符串 但我有一个用例需要我保留它们 KeyStore 只允许从与分配给我的应用程序相同的 UID 进行访问 并且它将使用设备主密码对数据进行加密 因
  • R Shiny Memory Leak - 有关如何查找的建议?

    我正在寻找有关如何识别 R 闪亮程序中内存泄漏的一般想法 我正在努力确定泄漏的确切位置 因此很难重新创建 而且我的代码已经超过 1000 行 我确信它与观察和观察事件有关 但我无法准确指出它 我实际上很喜欢 bborgeser 在这里提出的
  • 如何根据iOS上的touchMove事件在屏幕上绘制动态矩形

    矩形将被视为两个点 第一个点将是 touchBegan 点 在 touchMove 上将是第二个点 矩形将根据用户手指的移动动态绘制 就像当您单击桌面并移动桌面时 鼠标您将获得动态矩形 Thanks 好的 这是你如何绘制矩形的方法touch
  • 如何展平嵌套的Python字典?

    我正在尝试展平嵌套字典 dict1 Bob shepherd 4 6 3 collie 23 3 45 poodle 2 0 6 Sarah shepherd 1 2 3 collie 3 31 4 poodle 21 5 6 Ann sh
  • 尽管确实存在,但“不存在具有给定标识符的行”

    我正在使用 Hibernate 并得到 线程 main 中的异常 org hibernate ObjectNotFoundException 不存在具有给定标识符的行 271 这个错误的奇怪之处在于 具有给定 id 的对象存在于数据库中 我
  • 子进程超时失败

    我想在子进程上使用超时 from subprocess32 import check output output check output sleep 30 shell True timeout 1 不幸的是 虽然这会引发超时错误 但它会在
  • 时间数组在建模中超出范围?

    这些天我正在尝试使用新的气象数据 以 netcdf 格式而不是旧的 cray 格式给出 运行我的气候模型 模型编译顺利 但是当进行模拟时 模型在第一天运行良好 但在模拟的第二天就停止了 总是在同一时间步长 无论我使用哪个开始日期 错误是 f
  • MySQL 的锁定和并发

    我目前正在将 Mysql 与 InnoDB 存储引擎用于所有表 所以 我想知道这是否是一个真正的问题以及是否有解决方案 例如 我将使用数据库事务向用户收费 1 检查他的余额 2 减去他的余额 3 将此余额记入某处 4 提交 如果更新发生在
  • 在 Chrome 扩展中,有没有一种方法可以以编程方式“单击”pageAction 按钮

    我有一个带有 pageAction 按钮的 Chrome 扩展程序 用户单击它 就会显示 popup html 窗口 以便用户可以执行需要的操作 有没有一种方法可以装饰页面上的链接 以便当用户单击该链接时 它会以编程方式向 pageActi
  • $this->form_validation->run() 在没有验证规则的情况下返回 FALSE

    使用 CodeIgniter 时Form validation类 该set rules 方法允许用户向其表单字段添加无限数量的检查 这些规则通常都定义在同一个地方 就在run 方法被调用 有效示例 Require the user to b
  • 为什么 jQuery 文件上传插件的进程事件不触发?

    我对 jQuery 文件上传插件有一个奇怪的问题 如果我使用这个 SITAX fileupload fileupload url myurl add function e data console log add event process
  • 如何将pandas数据框的单行拆分为两行?

    我试图将数据框的单行分成两行 在数据框中 开始和结束列可用 我想根据条件拆分行 我有一个如下所示的数据框 symbol start end size ABC 2015 08 27 18 00 00 2015 08 28 05 00 00 1
  • Haskell:为什么将辅助函数命名为“go”?

    I see go在阅读 Haskell 材料或源代码时 我经常会遇到这样的情况 但我从来没有真正感到舒服 我猜它在我的脑海中具有 goto 的负面含义 我开始用 LYAH 学习 Haskell 这就是我开始使用 Haskell 的原因acc