【问题标题】:Dollar sign inside closed parens [duplicate]封闭括号内的美元符号[重复]
【发布时间】:2015-06-24 17:34:53
【问题描述】:
Websocket snippet 有一个像这样在封闭括号内有美元符号的语句,
any ($ fst client)
既然haskellers 使用$ 符号而不是parens,为什么我们在这里需要parens?
为什么括号之间有$ 符号?
我试图通过做来查看$是否是一个函数
Prelude>:t $
但它抛出了错误,parse error on input $
【问题讨论】:
标签:
haskell
syntax
operator-keyword
dollar-sign
【解决方案1】:
在 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)。您拥有的代码 sn-p 检查函数列表中的 any 是否在给定 fst client 的情况下返回 true。
【解决方案2】:
($ fst client) 是一个运算符部分(就像 (+ 1) 或 (* 2) 一样) - 它部分地将运算符应用于其右操作数。更详细的写法是(\f -> f $ fst client)。
因此,您将any 应用于一个函数,该函数接受另一个函数并将该函数应用于参数fst client。