На сколько аргументов распространяется эта функция? - PullRequest
0 голосов
/ 22 октября 2018
((lambda (x y) (* x y)) (2 3))

application: not a procedure;
 expected a procedure that can be applied to arguments
  given: 2
  arguments...:
   3
  context...:
   /Applications/Racket v7.0/share/pkgs/sandbox-lib/racket/sandbox.rkt:493:0: call-with-custodian-shutdown
   /Applications/Racket v7.0/collects/racket/private/more-scheme.rkt:148:2: call-with-break-parameterization
   .../more-scheme.rkt:261:28
   /Applications/Racket v7.0/share/pkgs/sandbox-lib/racket/sandbox.rkt:861:5: loop

Правильное выражение должно быть

((lambda (x y) (* x y)) 2 3)

Но я все еще не совсем понимаю сообщение об ошибке.

Given 2

указывает, что функция ожидает 2 аргумента, еслине так ли?Но что означает следующее:

arguments...:
   3

Я думаю, что функция принимает (2 3) в качестве одного аргумента.Почему это говорит 3?

1 Ответ

0 голосов
/ 22 октября 2018

Вы видите ошибку , а не ошибка несоответствия арности.Когда вы применяете функцию с неправильным числом аргументов в 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

Давайте разберем это сообщение.

  1. В сообщении об ошибке не упоминается какое-либо конкретное имя функции.Вместо этого сторона, сообщающая об этом сообщении об ошибке, является просто «приложением», то есть часть языка, которая реализует функцию приложения, сама вызывает ошибку.

  2. Краткое описаниесообщение об ошибке «не процедура».Это означает, что вы пытались применить какое-то значение как функцию, но это не было функцией вообще.Более подробное описание раскрывает это: ожидалось, что функция может быть применена, но она нашла что-то еще.

  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), что недопустимо.Ошибка сообщает об этом нарушении.

...