2012-07-21 41 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

花括號用於記錄類型的語法。在此代碼中,模式匹配用於將記錄類型參數解構爲其組件字段。