这个例子似乎打破了$的类型sig,并且它有效

The*_*kle 4 haskell types map apply

如果类型($)(a -> b) -> a -> b,那么为什么你可以把它作为咖喱($2)?2不是类型(a -> b).见下面的例子.

map ($2)[(+1),(+2)]
Run Code Online (Sandbox Code Playgroud)

这是合法的,令人敬畏的,直觉上有意义.请告诉我它是如何与类型系统规则一致的?

干杯

Tho*_*son 11

您观察到的行为是由于部分应用程序对中缀运算符的作用.这通常被称为"部分应用程序",您正在申请2作为第二个参数的"正确部分".所以你有了:

($) :: (a -> b) -> a -> b
                   ^
                   |
                  This is the type variable for the argument '2'
Run Code Online (Sandbox Code Playgroud)

您可以通过以下方式确认:

ghci
> :t ($2)
($2) :: Num a => (a -> b) -> b
Run Code Online (Sandbox Code Playgroud)

您可以在大多数相当完整的教程中找到隐藏此信息的内容,或者您​​可以在部分中看到Haskell报告部分.