【问题标题】: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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-22
      • 2023-04-06
      • 2018-03-22
      • 2021-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多