“$”是 haskell 中的函数吗?

Is '$' a function in haskell?

我对 haskell 中的 ($) 很困惑。

当我输入时

:t ($)

在 ghci 中。我会得到

:($) :: (a -> b) -> a -> b

但是,当我输入

:t ($ 3)

我会得到

($ 3) :: Num a => (a -> b) -> b

那么,为什么($)接受第二个参数没有任何错误?

($)是一个运算符,也就是一个中缀函数。它的定义非常简单(事实上,唯一使它有趣的是它的 固定性 ,而且我确信 google 有大量关于它的资源):

($) :: (a -> b) -> a -> b
f $ x = f x

与所有运算符一样,您可以通过仅应用第一个或仅应用第二个参数来获取它的 sections。添加 (+) 运算符可能会更明显:

(+ 2) -- equivalent to \x -> x + 2
(2 +) -- equivalent to \x -> 2 + x

($ 3) 也是如此 - 它等同于 \f -> f $ 3。这个函数的类型应该很清楚了:它的参数 f 本身必须是一个接受数字和 returns 其他东西(f :: Num a => a -> b)的函数,并且整个函数 returns 与 whatever f returns 相同的类型。这给出了

(\f -> f $ 3) :: Num a => (a -> b) -> b

因此 ($ 3) :: Num a => (a -> b) -> b