Фильтр схемы/рэкета/сопоставление нескольких аргументов

Допустим, я хочу сделать следующее:

(define (foo lst x)
   (filter function lst)

но function принимает 2 аргумента (и function был передан мне), один из которых является списком lst, который он будет использовать, а другой — x. Синтаксически, как бы я изменил эту строку, чтобы передать второй аргумент? Извините, я новичок в Scheme/DrRacket.


person Matthew Sadowski    schedule 22.09.2015    source источник


Ответы (2)


Попробуйте это, используя curry:

(define (foo lst x)
   (filter (curry function x) lst))

То есть, если предположить, что function принимает в качестве первого параметра x и в качестве второго параметра каждый из элементов в lst. Другими словами, приведенное выше эквивалентно этому:

(define (foo lst x)
  (filter (lambda (e) (function x e))
          lst))

В любом случае: трюк (называемый каррированием) заключается в создании новой функции, которая получает один аргумент, и передает его исходной функции, у которой другой аргумент зафиксирован с заданным значением x.

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

person Óscar López    schedule 22.09.2015
comment
Спасибо! Это то, что я хотел. - person Matthew Sadowski; 23.09.2015

Самый простой:

(define (foo ys x)
   (filter (λ (y) (function y x)) ys)

Альтернатива:

(define (foo ys x)
   (for/list                    ; collect results into a list
      ([y ys]]                  ; for each element y in the list ys
        #:when (function y x))  ;   when (function y x) collect
      x))                             x

Или без комментариев:

 (define (foo ys x)
   (for/list ([y ys]] #:when (function y x))
      x)))
person soegaard    schedule 23.09.2015