为什么 Haskell 中的函数“bracket”被称为“bracket”

Jul*_*ian 5 haskell

为什么这个bracket函数叫括号?

我认为这与类型签名语法有关;类型签名中使用方括号来表示函数。让我们看看函数映射的类型签名:

map :: (a -> b) -> [a] -> [b]
Run Code Online (Sandbox Code Playgroud)

map的第一个参数是一个函数。

现在,让我们来看看bracketHackage。

bracket:: IO a -> (a -> IO b) -> (a -> IO c)  -> IO c
Run Code Online (Sandbox Code Playgroud)

支架: https://hackage.haskell.org/package/base-4.16.0.0/docs/Control-Exception.html#v :bracket

好的,我明白了,括号的参数是具有 IO 操作的函数。

Hackage 的使用示例bracket如下:

bracket
  (openFile "filename" ReadMode)
  (hClose)
  (\fileHandle -> do { ... })
Run Code Online (Sandbox Code Playgroud)

想了一会儿,我觉得“括号”这个名字不太好。

我想说“performResourceSafely”会更合适。

于是我又问:bracket函数为什么叫bracket?

Dan*_*ner 13

\n

括号v. 在两侧绑定,包围,如用括号括起来
\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xe2\x80\x94维基词典

\n
\n

它所做的事情bracket是将一些使用资源的操作与分配和释放该资源的操作包装在一起(要小心确保即使抛出异常也会发生释放)。因此,(取消)分配操作围绕 \xe2\x80\x93 或将 \xe2\x80\x93括起来为主操作。

\n

您提到的文件示例特别具有启发性。[就像or的“开括号”和or(的“闭括号”一样,括号操作是“打开文件”和“关闭文件”(或者“关闭句柄”)。这种相似之处相当普遍。例如,对于数据库,一个打开和关闭一个连接,对于网络东西,一个打开和关闭一个会话,对于子进程,一个打开和关闭一个程序,等等。])

\n

  • 因此,当您使用 `bracket` 时,您是在说“对参数 #3 给出的括号目标计算以及对参数 #1 和 #2 给出的计算”。 (3认同)
  • @朱利安 没错。 (2认同)