2015-12-17 2 views
1

Функция matrix-qr в математической библиотеке Racket выводит два значения. Я знаю о вызовах со значениями, чтобы оба выходных значения были в следующей функции.Определение констант из нескольких значений возврата Racket

  1. Однако, как я могу принимать каждый отдельный вывод и задавать константу с этим значением? Функция QR выводит Q-матрицу и R-матрицу. Мне нужно что-то вроде:

    (определяют Q ...)
    (определить R ...)

  2. Кроме того, как я мог использовать только один из выходов из функции, которая выводит два значения?

ответ

2

Обычный способ создания определений для нескольких значений заключается в использовании define-values, который в значительной степени работает так, как вы ожидали.

(define-values (Q R) ; Q and R are defined 
    (matrix-qr (matrix [[12 -51 4] 
         [ 6 167 -68] 
         [-4 24 -41]]))) 

Существует также let эквивалент для нескольких значений, называется let-values (а также let*-values и letrec-values).

Игнорирование значений сложнее. Например, нет такой функции, как (first-value ...), поскольку обычное функциональное приложение не создает продолжения, которое может принимать несколько значений. Тем не менее, вы можете использовать что-то вроде match-define-values вместе с маркером отверстий _, чтобы игнорировать значения и просто не связывать их.

(match-define-values (Q _) ; only Q is defined 
    (matrix-qr (matrix [[12 -51 4] 
         [ 6 167 -68] 
         [-4 24 -41]]))) 

Теоретически можно создать макрос, который может либо конвертировать несколько значений в виде списка или просто использовать только конкретное значение, но в целом это избежать. Возвращение нескольких значений не должно выполняться легко, поэтому для почти всех возвращаемых им функций обычно не имеет смысла использовать одно из значений, но игнорировать другое.

Смежные вопросы