gpt4 book ai didi

haskell - Haskell中花括号的用途是什么?

转载 作者:行者123 更新时间:2023-12-04 13:11:57 27 4
gpt4 key购买 nike

下面的代码

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大括号( {..} )内的点的用途是什么?

最佳答案

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

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

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

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

关于haskell - Haskell中花括号的用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11591170/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com