2017-02-13 207 views
7

在Data.ByteString.Internal,该字节串具有构造器双重感叹号的用法是什么?

PS !!(ForeignPtr Word8) !!Int !!Int 

是什么,这些双惊叹这里的意思?我搜索并刚刚得到(!!)可用于索引列表(!!) :: [a] -> Int -> a

+0

它通常用于* *严格评估(与*惰性计算*),所以操作数调用的函数之前进行评估。 –

+0

@WillemVanOnsem,我记得有一个感叹号(!)可以使操作符严格,做双重惊叹号吗? – hliu

+1

http://hackage.haskell.org/package/bytestring-0.10.8.1/docs/src/Data-ByteString-Internal.html#ByteString - 你在哪里看到你的代码? – melpomene

回答

7

这不是实际Haskell源代码的一部分,而是Haddock如何渲染无箱数据类型的一个(未记录的)特性。见https://mail.haskell.org/pipermail/haskell-cafe/2009-January/054135.html

2009年1月21日斯蒂芬·弗里德里希< ...>:使用

嗨,

鳕鱼-2.4.1本文件:

module Test where 

data Test 
    = NonStrict Int 
    | Strict !Int 
    | UnpackedStrict {-# UNPACK #-} !Int 

生成的文档看起来像这样:

data Test 
Constructors 
NonStrict Int 
Strict !Int 
UnpackedStrict !!Int 

注意双“!”在最后的构造函数中。这不是打算 的行为,是吗?

这是GHC相当打印无盒类型的方式,所以我认为Haddock 应遵循相同的约定。嗯,或许Haddock在其文档中应该有一个关于语言扩展的 章节,其中提到了GHC文档的 。这种方式使用的语言最少记录在 。不知道它是否有助于这种情况,因为“!!” 可能没有记录在那里。

也许我们不应该显示unbox注释,因为它们是 的一个实现细节,对不对?我们可以显示一个“!”相反, 表明参数是严格的。

大卫