闭括号内的美元符号

Dollar sign inside closed parens

Websocket snippet 有一个语句在封闭的括号内有美元符号,像这样,

any ($ fst client)

既然 haskellers 使用 $ 符号而不是括号,为什么我们在这里需要括号?

为什么括号之间有一个$符号?

我试图通过

来查看 $ 是否是一个函数
Prelude>:t $

但是它抛出了错误,parse error on input $

($ fst client) 是一个运算符部分(就像 (+ 1)(* 2))——它部分地将运算符应用于它的右操作数。更详细的写法是 (\f -> f $ fst client).

因此,您正在将 any 应用于一个接受另一个函数并将该函数应用于参数 fst client 的函数。

在Haskell中,运算符只是普通函数,其名称由符号组成,默认使用中缀。您可以像普通标识符一样使用它们,只需将它们括在括号中即可:

λ> :t (+)
(+) :: Num a => a -> a -> a

$ 本身就是一个这样的运算符。表示函数应用,定义如下:

f $ x = f x

你可以得到它的类型就像(+):

λ> :t ($)
($) :: (a -> b) -> a -> b

Haskell 运算符也可以像普通函数一样部分应用,方法是将它们包装在括号中,并将参数放在一侧。例如,(+ 1)\ x -> x + 1 相同,(1 +)\x -> 1 + x 相同。

这也适用于 $,因此 ($ fst client)\ f -> f $ fst client 相同或只是 \ f -> f (fst client)。您拥有的代码片段检查给定 fst client.

函数列表 returns 的 any 是否为真