Websocket 片段有一个语句,在这样的封闭括号内有美元符号,
any ($ fst client)
既然haskellers使用$
符号而不是parens,为什么我们在这里需要parens?
为什么括号之间有$
符号?
我试图$
通过做来查看是否是一个函数
Prelude>:t $
但它抛出了错误,parse error on input $
Websocket 片段有一个语句,在这样的封闭括号内有美元符号,
any ($ fst client)
既然haskellers使用$
符号而不是parens,为什么我们在这里需要parens?
为什么括号之间有$
符号?
我试图$
通过做来查看是否是一个函数
Prelude>:t $
但它抛出了错误,parse error on input $
在 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
。
这也适用于$
,所以与or($ fst client)
相同。您拥有的代码片段检查是否有任何函数列表返回 true given 。\ f -> f $ fst client
\ f -> f (fst client)
fst client
($ fst client)
是一个运算符部分(就像(+ 1)
or (* 2)
) - 它部分地将运算符应用于其右操作数。更详细的编写方式是(\f -> f $ fst client)
.
因此,您正在应用any
一个函数,该函数接受另一个函数并将该函数应用于参数fst client
。