在Haskell中使用花括号吗?

问题描述 投票:6回答:2

下面的代码

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中花括号({..})内使用点是什么?

haskell curly-braces
2个回答
15
投票

Handle__数据类型可能是用记录语法定义的,如下所示:

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

大括号用于匹配记录类型的字段。因此,声明中说:“检查参数是否为Handle__构造函数;在这种情况下,将haCharBuffer的值存储在ref中,将haBuffers的值存储在spare_ref中,并将[ C0] in haBufferMode

[当您写mode时,这与说Handle__ {..}是相同的;数据结构中的所有字段都绑定到其字段名称。


4
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.