为什么函数`bracket` 在 Haskell 中称为括号
Why is function `bracket` called bracket in Haskell
为什么bracket
函数叫括号?
我认为它与 类型签名 语法有关;类型签名中使用方括号表示函数。让我们看看函数映射的类型签名:
map :: (a -> b) -> [a] -> [b]
map的第一个参数是一个函数。
现在,让我们看看 bracket
上的 Hackage。
bracket:: IO a -> (a -> IO b) -> (a -> IO c) -> IO c
支架:
https://hackage.haskell.org/package/base-4.16.0.0/docs/Control-Exception.html#v:bracket
好的,明白了,bracket的参数是带IO动作的函数
Hackage 上的示例使用 bracket
如下:
bracket
(openFile "filename" ReadMode)
(hClose)
(\fileHandle -> do { ... })
想了想,觉得“括号”这个名字不太好。
我会说“performResourceSafely”更合适。
所以我再问:bracket
函数为什么叫括号?
bracket v. To bound on both sides, to surround, as enclosing with brackets
— wiktionary
bracket
所做的事情是它将一些使用资源的操作与分配和释放该资源的操作包装在一起(注意确保即使在抛出异常时也会发生释放)。因此,(取消)分配操作围绕 – 或 bracket – 主要操作。
您提到的文件示例特别具有启发性。就像 [
或 (
的“开括号”和 ]
或 )
的“闭括号”一样,括号操作是“打开文件”和“关闭文件”(嗯,“关闭句柄”)。这种并行是相当普遍的;例如对于数据库,一个打开和关闭一个连接,一个打开和关闭一个连接,一个打开和关闭一个会话,一个打开和关闭一个会话,一个打开和关闭一个程序,等等。
为什么bracket
函数叫括号?
我认为它与 类型签名 语法有关;类型签名中使用方括号表示函数。让我们看看函数映射的类型签名:
map :: (a -> b) -> [a] -> [b]
map的第一个参数是一个函数。
现在,让我们看看 bracket
上的 Hackage。
bracket:: IO a -> (a -> IO b) -> (a -> IO c) -> IO c
支架: https://hackage.haskell.org/package/base-4.16.0.0/docs/Control-Exception.html#v:bracket
好的,明白了,bracket的参数是带IO动作的函数
Hackage 上的示例使用 bracket
如下:
bracket
(openFile "filename" ReadMode)
(hClose)
(\fileHandle -> do { ... })
想了想,觉得“括号”这个名字不太好。
我会说“performResourceSafely”更合适。
所以我再问:bracket
函数为什么叫括号?
bracket v. To bound on both sides, to surround, as enclosing with brackets
— wiktionary
bracket
所做的事情是它将一些使用资源的操作与分配和释放该资源的操作包装在一起(注意确保即使在抛出异常时也会发生释放)。因此,(取消)分配操作围绕 – 或 bracket – 主要操作。
您提到的文件示例特别具有启发性。就像 [
或 (
的“开括号”和 ]
或 )
的“闭括号”一样,括号操作是“打开文件”和“关闭文件”(嗯,“关闭句柄”)。这种并行是相当普遍的;例如对于数据库,一个打开和关闭一个连接,一个打开和关闭一个连接,一个打开和关闭一个会话,一个打开和关闭一个会话,一个打开和关闭一个程序,等等。