'$'是haskell中的一个功能吗?

sep*_*cmk 0 syntax haskell dollar-sign

我对haskell的($)感到很困惑.

当我输入

:t ($)
Run Code Online (Sandbox Code Playgroud)

在ghci.我会得到

:($) :: (a -> b) -> a -> b
Run Code Online (Sandbox Code Playgroud)

但是,当我输入

:t ($ 3)
Run Code Online (Sandbox Code Playgroud)

我会得到

($ 3) :: Num a => (a -> b) -> b
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*lec 8

($)是一个运算符,它是一个中缀函数.它的定义非常简单(实际上唯一让它变得有趣的是它的固定性,而且我确信谷歌有很多资源):

($) :: (a -> b) -> a -> b
f $ x = f x
Run Code Online (Sandbox Code Playgroud)

与所有运算符一样,您可以通过仅应用第一个或仅第二个参数来获取部分运算符.对于加法(+)运算符,这可能更明显:

(+ 2) -- equivalent to \x -> x + 2
(2 +) -- equivalent to \x -> 2 + x
Run Code Online (Sandbox Code Playgroud)

这同样适用($ 3)- 它相当于\f -> f $ 3.这个函数的类型应该非常清楚:它的参数f必须是一个函数,它接受一个数字并返回一些else(f :: Num a => a -> b),整个函数返回与返回相同的类型f.这给了

(\f -> f $ 3) :: Num a => (a -> b) -> b
Run Code Online (Sandbox Code Playgroud)

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