The code below
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)
is from the GHC source code (ghc-7.4.1\libraries\base\GHC\IO\Handle\Text.hs). I want to know why the code uses curly braces in place of the arguments. And how the variables haCharBuffer, haBuffers, haBufferMode
take values from ref, spare_ref
and mode
. These values haven't defined.
Another fragment of code from GHC that needs clarification is this:
flushByteWriteBuffer :: Handle__ -> IO ()
flushByteWriteBuffer h_@Handle__{..} = do
bbuf <- readIORef haByteBuffer
when (not (isEmptyBuffer bbuf)) $ do
bbuf' <- Buffered.flushWriteBuffer haDevice bbuf
writeIORef haByteBuffer bbuf'
In the codefile ghc-7.4.1\libraries\base\GHC\IO\Handle\Internals.hs
Which is the use of dots inside the braces ({..}
)?
The Handle__
data type was probably defined with record syntax, like this:
data Handle__ =
Handle__
{ haCharBuffer :: IORef (...something...)
, haBuffers :: IORef (...something...)
, haBufferMode :: BufferMode
}
The curly braces are used to match against the fields of the record type. So, the declaration says: "Check if the argument is of the Handle__
constructor; in that case, store the value of haCharBuffer
in ref
, the value of haBuffers
in spare_ref
and the value of haBufferMode
in mode
"
When you write Handle__ {..}
it's the same thing as saying Handle__ { haCharBuffer = haCharBuffer, haBuffers = haBuffers, haBufferMode = haBufferMode }
; all the fields in the data structure are bound to their field names.
Curly braces is used in the syntax for record types. In this code, pattern matching is used to deconstruct the record type argument into its component fields.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With