如果 for 的类型($)
是(a -> b) -> a -> b
,那么为什么允许将其 curry 为($2)
?2 不是类型(a -> b)
。请参见下面的示例。
map ($2)[(+1),(+2)]
这是合法的,令人敬畏的并且直观地是有道理的。请告诉我它如何与类型系统规则保持一致?
干杯
您观察到的行为是由于部分应用程序对中缀运算符的工作方式。这通常称为“部分应用程序”,您将2
作为“正确部分”应用,这将是第二个参数。所以你有了:
($) :: (a -> b) -> a -> b
^
|
This is the type variable for the argument '2'
您可以通过以下方式确认:
ghci
> :t ($2)
($2) :: Num a => (a -> b) -> b
您可能会在最完整的教程中的某个地方找到隐藏的此信息,或者您可以在部分中查看Haskell 报告部分。