4

如果 for 的类型($)(a -> b) -> a -> b,那么为什么允许将其 curry 为($2)?2 不是类型(a -> b)。请参见下面的示例。

map ($2)[(+1),(+2)]

这是合法的,令人敬畏的并且直观地是有道理的。请告诉我它如何与类型系统规则保持一致?

干杯

4

1 回答 1

11

您观察到的行为是由于部分应用程序对中缀运算符的工作方式。这通常称为“部分应用程序”,您将2作为“正确部分”应用,这将是第二个参数。所以你有了:

($) :: (a -> b) -> a -> b
                   ^
                   |
                  This is the type variable for the argument '2'

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

ghci
> :t ($2)
($2) :: Num a => (a -> b) -> b

您可能会在最完整的教程中的某个地方找到隐藏的此信息,或者您可以在部分中查看Haskell 报告部分。

于 2013-07-09T06:41:31.413 回答