Websocket snippet有一个声明,在这样的封闭的parens中有美元符号,
any ($ fst client)
由于haskellers使用$
符号代替parens,为什么我们需要parens?
为什么parens之间有$
符号?
我试图通过
查看$
是否为函数
Prelude>:t $
但它抛出错误parse error on input $
答案 0 :(得分:13)
在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
时任何函数列表返回true。
答案 1 :(得分:3)
($ fst client)
是一个运算符部分(就像(+ 1)
或(* 2)
) - 它将运算符部分应用于其右操作数。写一个更详细的方法是(\f -> f $ fst client)
。
所以你将any
应用于一个带有另一个函数的函数,并将该函数应用于参数fst client
。