Dan*_*ton 79 haskell naming-conventions
我go
在阅读Haskell材料或源代码时看到了很多,但我从来没有对它感到很自在 - (我想它在我的脑海中有"goto"的负面含义).我开始用LYAH学习Haskell,这就是我选择使用acc
和step
写折叠时的倾向.写作的惯例go
来自哪里?
最重要的是,该名称到底go
意味着什么?
Don*_*art 134
哼!一些考古学!
从2004年左右开始,我在使用go
递归函数的worker/wrapper转换时,将其用作尾递归工作循环的通用名称.我开始广泛使用它bytestring
,例如
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 #-}
Run Code Online (Sandbox Code Playgroud)
是从bytestring
2005年8月.
这是用RWH写的,可能从那里开始普及.此外,在流融合库中,Duncan Coutts和我开始做很多事情.
来自GHC的消息来源
这个成语虽然可以追溯到更远的地方.foldr
在GHC.Base中给出如下:
foldr k z = go
where
go [] = z
go (y:ys) = y `k` go ys
Run Code Online (Sandbox Code Playgroud)
这可能是我接受诀窍的地方(我以为这是来自Andy Gill的论文,但在go
那里找不到任何用处).它不是以这种形式给出GOFER,所以我觉得这个最早出现在GHC代码库.
到2001年,Simon Marlow正在使用go
一些系统级代码,因此我们可能将责任归咎于GHC,这条线索引导我们进入GHC源,其中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)
Run Code Online (Sandbox Code Playgroud)
GHC 3.02和格拉斯哥
挖掘GHC的旧版本,我们看到在GHC 0.29中这个成语没有出现,但是GHC 3.02系列(1998),这个go
成语随处可见.1996-1997年Numeric.lhs
定义中的一个例子showInt
:
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'
}}
Run Code Online (Sandbox Code Playgroud)
这是与H98报告中给出的不同的实现.挖掘到实施"Numeric.lhs",但是,我们发现,这是不一样的加入GHC 2.06在1997年的版本,并出现从Sigbjorne Finne一个非常有趣的补丁,在1998年4月,加入go
循环到Numeric.lhs.
这说明至少到1998年,Sigbjorne正在go
为GHC"std"库添加循环,同时,GHC编译器核心中的许多模块都有go
循环.进一步深入,1996年7月Will Partain的这个非常有趣的提交为GHC添加了一个"go"循环 - 代码来自Simon PJ!
所以我打算把它称为格拉斯哥人在90年代中期从事GHC工作的格拉斯哥成语,比如Simon Marlow,Sigbjorn Finne,Will Partain和Simon Peyton Jones.
Mic*_*man 17
唐的回答显然是正确的.让我加上一个小细节(因为它似乎是我直接指的是我的写作):go很好,因为它只有两个字母.
哦,Yesod书中为调查器包提供了如此多的内容的原因是因为我已经将调查员的三部分教程编写为博客文章系列,因此我决定将其包含在书中.枚举器包在Yesod的许多地方使用,因此它是相关的.
Con*_*nal 11
我希望这个成语不仅适用于线性结构(因此也适用于"循环"),而且适用于分支(树状)结构.
我想知道go
模式多久经常与累积参数相对应,更常见的是,Mitch Wand在" 基于继续的程序转换策略"(我最喜欢的论文之一)中探讨了延续编码策略.在这些情况下,该go
函数具有特定含义,然后可以使用该函数从优雅的规范中导出有效的代码.