双重惊叹的用法是什么?

hli*_*liu 7 haskell

在Data.ByteString.Internal中,ByteString具有构造函数

PS !!(ForeignPtr Word8) !!Int !!Int 
Run Code Online (Sandbox Code Playgroud)

这些双重惊叹在这里意味着什么?我搜索并得到(!!)可用于索引列表(!!) :: [a] -> Int -> a.

mel*_*ene 7

这不是实际Haskell源的一部分,而是Haddock如何呈现未装箱数据类型的(未记录的)功能.请参阅https://mail.haskell.org/pipermail/haskell-cafe/2009-January/054135.html:

2009/1/21 Stephan Friedrichs <...>:

嗨,

使用haddock-2.4.1和这个文件:

module Test where

data Test
    = NonStrict Int
    | Strict !Int
    | UnpackedStrict {-# UNPACK #-} !Int
Run Code Online (Sandbox Code Playgroud)

生成的文档如下所示:

data Test
Constructors
 NonStrict Int
 Strict !Int
 UnpackedStrict !!Int
Run Code Online (Sandbox Code Playgroud)

注意双'!' 在最后一个构造函数中.这不是预期的行为,是吗?

这是GHC非常打印未装箱类型的方式,所以我认为Haddock应遵循相同的惯例.嗯,也许Haddock应该在其文档中有一章关于语言扩展,并参考GHC文档.这样使用的语言至少记录在案.不知道在这种情况下是否有帮助,因为"!!" 可能没有在那里记录.

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

大卫