2012-07-21 2 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-에서

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 \ 라이브러리를 \ Text.hs

설명이 필요 GHC에서 코드의 또 다른 조각을 처리 GHC \ IO \ \ \ 기지 것은 이것이다 7.4.1 \ libraries \ base \ GHC \ IO \ Handle \ Internals.hs 중괄호 안에 점을 사용하는 것은 무엇입니까?

감사

답변

12

Handle__ 데이터 유형은 아마 다음과 같이 기록 구문으로 정의했다 : 중괄호가 레코드 유형의 필드에 대해 일치시키는 데 사용되는

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

. 그래서, 선언은 말한다 : "인수가 Handle__ 생성자 인 경우 확인,이 경우, refspare_ref에서 haBuffers의 가치와 modehaBufferMode의 값 haCharBuffer의 값을 저장"당신이 쓰는

Handle__ {..}Handle__ { haCharBuffer = haCharBuffer, haBuffers = haBuffers, haBufferMode = haBufferMode }과 똑같습니다. 데이터 구조의 모든 필드는 필드 이름에 바인드됩니다.

+1

질문을 편집했기 때문에 내부에 점이있는 중괄호에 대한 두 번째 부분에 대답 할 수 있습니까? 감사합니다 – Dragno

+0

자세한 내용은 편집을 참조하십시오. – dflemstr

+0

고맙습니다. – Dragno

4

중괄호는 레코드 유형의 구문에 사용됩니다. 이 코드에서는 패턴 매칭을 사용하여 레코드 유형 인수를 해당 구성 요소 필드로 분해합니다.

관련 문제