Когда вы опускаете все параметры в частично примененном выражении функции, вам нужно следовать за ним с _
, если компилятору не требуется тип функции в месте, где вы используете это.
Когда вы вызываете метод ::
для Foo
, компилятор ожидает тип Int => Int
для параметра. Таким образом, вы можете смело опускать подчеркивание после square
в этой позиции.
Однако метод ::
в Nil
может принимать параметр любого типа . Поэтому вместо того, чтобы предполагать, что вы хотели частично применить функцию, она будет жаловаться, если вы не сделаете ее абсолютно явной, добавив _
.
Итак, это правила ... Я не могу вас просветить о почему это правила; Может быть, кто-то еще, кто лучше знает компилятор, систему типов и дизайн языка, сможет сказать вам, почему. Но я предполагаю, что без этих правил во многих местах возникнет опасность случайной двусмысленности.