5

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

any ($ fst client)

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

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

我试图$通过做来查看是否是一个函数

Prelude>:t $

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

4

2 回答 2

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

这也适用于$,所以与or($ fst client)相同。您拥有的代码片段检查是否有任何函数列表返回 true given 。\ f -> f $ fst client\ f -> f (fst client)fst client

于 2015-04-17T18:19:24.157 回答
3

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

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

于 2015-04-17T18:19:00.423 回答