在Haskell中使用花括号是什么意思?

Dra*_*gno 6 haskell curly-braces curly-brackets

下面的代码

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)
Run Code Online (Sandbox Code Playgroud)

来自GHC源代码.我想知道为什么这段代码的作者在参数的位置使用花括号.以及变量haCharBuffer,haBuffers,haBufferMode如何从ref,spare_ref和mode中获取值.这些值尚未定义.代码文件是ghc-7.4.1\libraries\base\GHC\IO\Handle\Text.hs

GHC代码的另一部分代码需要澄清:

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

在代码文件中ghc-7.4.1\libraries\base\GHC\IO\Handle\Internals.hs哪些是使用大括号内的点?

谢谢

dfl*_*str 15

Handle__数据类型可能是用记录语法定义的,就像这样:

data Handle__ =
  Handle__
  { haCharBuffer :: IORef (...something...)
  , haBuffers :: IORef (...something...)
  , haBufferMode :: BufferMode
  }
Run Code Online (Sandbox Code Playgroud)

花括号用于匹配记录类型的字段.所以,声明说:"检查参数是否是Handle__构造函数;在这种情况下,存储haCharBufferin ref的值,haBuffersin spare_ref的值和haBufferModein 的值mode"

当你写Handle__ {..}它时,它就像说的一样Handle__ { haCharBuffer = haCharBuffer, haBuffers = haBuffers, haBufferMode = haBufferMode }; 数据结构中的所有字段都绑定到其字段名称.


new*_*cct 5

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