在Haskell中,花括号的用途是什么?

9
以下是代码:
getSpareBuffer :: Handle__ -> IO (BufferMode, CharBuffer)
getSpareBuffer Handle__{haCharBuffer=ref, 
                    haBuffers=spare_ref,
                    haBufferMode=mode}
 = do
   case mode of
     NoBuffering -> return (mode, error "no buffer!")
     _ -> do
          bufs <- readIORef spare_ref
          buf  <- readIORef ref
          case bufs of
            BufferListCons b rest -> do
                writeIORef spare_ref rest
                return ( mode, emptyBuffer b (bufSize buf) WriteBuffer)
            BufferListNil -> do
                new_buf <- newCharBuffer (bufSize buf) WriteBuffer
                return (mode, new_buf)

这段代码来自GHC源代码 (ghc-7.4.1\libraries\base\GHC\IO\Handle\Text.hs)。我想知道为什么代码在参数的位置使用花括号,以及变量haCharBuffer,haBuffers,haBufferMode如何从ref, spare_refmode中获取值。这些值还没有定义。

GHC的另一段代码需要澄清:

flushByteWriteBuffer :: Handle__ -> IO ()
flushByteWriteBuffer h_@Handle__{..} = do
  bbuf <- readIORef haByteBuffer
  when (not (isEmptyBuffer bbuf)) $ do
    bbuf' <- Buffered.flushWriteBuffer haDevice bbuf
    writeIORef haByteBuffer bbuf'

在代码文件 ghc-7.4.1\libraries\base\GHC\IO\Handle\Internals.hs 中,大括号内使用点号 ({..}) 的含义是什么?
2个回答

19

Handle__ 数据类型可能是使用记录语法定义的,例如:

data Handle__ =
  Handle__
  { haCharBuffer :: IORef (...something...)
  , haBuffers :: IORef (...something...)
  , haBufferMode :: BufferMode
  }
花括号用于匹配记录类型的字段。因此,该声明是这样的: “检查参数是否为Handle__构造函数; 如果是,则将haCharBuffer的值存储在ref中,将haBuffers的值存储在spare_ref中,并将haBufferMode的值存储在mode中。”
当您编写Handle__ {..}时,实际上就相当于编写Handle__ { haCharBuffer = haCharBuffer, haBuffers = haBuffers, haBufferMode = haBufferMode };数据结构中的所有字段都绑定到其字段名称。

5

花括号在记录类型的语法中使用。在这段代码中,模式匹配用于将记录类型参数解构为其组成字段。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接