8

以下のコード

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ソースコードからのものです(ghc-7.4.1\libraries\base\GHC\IO\Handle\Text.hs)。コードが引数の代わりに中括弧を使用する理由を知りたいです。また、変数がとhaCharBuffer, haBuffers, haBufferModeから値を取得する方法。これらの値は定義されていません。ref, spare_refmode

明確化が必要な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 内のドットの使用はどれですか?{..}

4

2 に答える 2

19

データ型は、次のHandle__ようなレコード構文で定義された可能性があります。

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

中かっこは、レコード タイプのフィールドと照合するために使用されます。したがって、宣言は次のように述べていますHandle__haCharBufferrefhaBuffersspare_refhaBufferModemode

あなたが書くとき、Handle__ {..}それは言うのと同じことHandle__ { haCharBuffer = haCharBuffer, haBuffers = haBuffers, haBufferMode = haBufferMode }です; データ構造内のすべてのフィールドは、フィールド名にバインドされています。

于 2012-07-21T10:00:55.840 に答える
5

中括弧は、レコード タイプの構文で使用されます。このコードでは、パターン マッチングを使用して、レコード タイプの引数をコンポーネント フィールドに分解しています。

于 2012-07-21T10:03:31.377 に答える