8

下面的代码

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, haBufferModeref, spare_ref和中获取值mode。这些值尚未定义。

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 大括号{..}

4

2 回答 2

19

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

data Handle__ =
  Handle__
  { haCharBuffer :: IORef (...something...)
  , haBuffers :: IORef (...something...)
  , haBufferMode :: BufferMode
  }

花括号用于匹配记录类型的字段。因此,声明说:“检查参数是否属于Handle__构造函数;在这种情况下,存储in 的值、 haCharBufferinref的值和haBuffersin的spare_ref值”haBufferModemode

当你写Handle__ {..}它和说一样的东西Handle__ { haCharBuffer = haCharBuffer, haBuffers = haBuffers, haBufferMode = haBufferMode }; 数据结构中的所有字段都绑定到它们的字段名称。

于 2012-07-21T10:00:55.840 回答
5

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

于 2012-07-21T10:03:31.377 回答