以下代码
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源代码。我想知道为什么这段代码的作者在参数的位置使用花括号。以及变量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'
在代码文件中ghc-7.4.1 \ libraries \ base \ GHC \ IO \ Handle \ Internals.hs 在大括号内使用点?
由于
答案 0 :(得分:15)
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 }
是一回事;数据结构中的所有字段都绑定到其字段名称。
答案 1 :(得分:4)
在记录类型的语法中使用了大括号。在此代码中,模式匹配用于将记录类型参数解构为其组件字段。