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。