【问题标题】:Which is the use of curly braces in Haskell?Haskell中花括号的用途是什么?
【发布时间】:2012-07-21 09:55:30
【问题描述】:

下面的代码

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


    【解决方案1】:

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

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

    花括号用于匹配记录类型的字段。因此,声明说:“检查参数是否属于Handle__ 构造函数;在这种情况下,将haCharBuffer 的值存储在ref 中,将haBuffers 的值存储在spare_ref 中以及@ 的值987654328@mode"

    当你写Handle__ {..} 时,它与写Handle__ { haCharBuffer = haCharBuffer, haBuffers = haBuffers, haBufferMode = haBufferMode } 是一样的;数据结构中的所有字段都绑定到它们的字段名。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2017-05-11
        • 2018-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-20
        • 2012-10-04
        • 2012-03-30
        • 2018-01-26
        相关资源
        最近更新 更多