为什么函数`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 – 主要操作。

您提到的文件示例特别具有启发性。就像 [( 的“开括号”和 ]) 的“闭括号”一样,括号操作是“打开文件”和“关闭文件”(嗯,“关闭句柄”)。这种并行是相当普遍的;例如对于数据库,一个打开和关闭一个连接,一个打开和关闭一个连接,一个打开和关闭一个会话,一个打开和关闭一个会话,一个打开和关闭一个程序,等等。