Вы видите ошибку , а не ошибка несоответствия арности.Когда вы применяете функцию с неправильным числом аргументов в Racket, вы получаете такую ошибку:
> (define (f x)
(void))
> (f 1 2)
f: arity mismatch;
the expected number of arguments does not match the given number
expected: 1
given: 2
arguments...:
1
2
Обратите внимание, что в сообщении об ошибке упоминается имя функции, в данном случае f
, иявно говорит «несоответствие арности» и включает в себя пояснительное описание.Сообщение об ошибке в вашем вопросе является другим:
application: not a procedure;
expected a procedure that can be applied to arguments
given: 2
arguments...:
3
Давайте разберем это сообщение.
В сообщении об ошибке не упоминается какое-либо конкретное имя функции.Вместо этого сторона, сообщающая об этом сообщении об ошибке, является просто «приложением», то есть часть языка, которая реализует функцию приложения, сама вызывает ошибку.
Краткое описаниесообщение об ошибке «не процедура».Это означает, что вы пытались применить какое-то значение как функцию, но это не было функцией вообще.Более подробное описание раскрывает это: ожидалось, что функция может быть применена, но она нашла что-то еще.
Учитывая вышеупомянутый контекст, «данная» часть сообщения об ошибке делает большесмысл.2
в сообщении не описывает некоторое количество аргументов, но фактически ссылается на значение , которое вы пытались применить.Вы можете воспроизвести это с немного сокращенным примером:
> (2 3)
application: not a procedure;
expected a procedure that can be applied to arguments
given: 2
arguments...:
3
Еще яснее, если мы воспользуемся примером, в котором нет чисел, чтобы значения не могли быть перепутаны с чем-то другим:
> ("not a function" "first arg" "second arg")
application: not a procedure;
expected a procedure that can be applied to arguments
given: "not a function"
arguments...:
"first arg"
"second arg"
Если мы вернемся к вашей исходной программе, станет ясно, что пошло не так.Из-за набора скобок вокруг (2 3)
вы пытаетесь применить 2
как функцию (поскольку скобки означают применение функции в Racket), что недопустимо.Ошибка сообщает об этом нарушении.