2012-07-21 92 views
4

下面在Haskell中使用花括号?

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中获取值。这些值尚未定义。所述的CodeFile是GHC-7.4.1 \库\基\ GHC \ IO \拉手\ Text.hs

从GHC需要澄清的代码的另一种片段是这样的:

flushByteWriteBuffer :: Handle__ -> IO() 
flushByteWriteBuffer [email protected]__{..} = do 
    bbuf <- readIORef haByteBuffer 
    when (not (isEmptyBuffer bbuf)) $ do 
    bbuf' <- Buffered.flushWriteBuffer haDevice bbuf 
    writeIORef haByteBuffer bbuf' 

在的CodeFile ghc- 7.4.1 \ libraries \ base \ GHC \ IO \ Handle \ Internals.hs 大括号内是否使用了点?

感谢

回答

12

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

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

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

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

+1

因为我编辑了这个问题,你能回答第二部分关于带点内部大括号的大括号吗?谢谢 – Dragno 2012-07-21 14:01:09

+0

请参阅我的编辑了解更多。 – dflemstr 2012-07-21 14:31:38

+0

好的非常感谢。 – Dragno 2012-07-21 18:19:21

4

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