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