2015-11-23 3 views
2

Это моя функция для кариФильтрация по списку номеров

(define (curry g) 
    (lambda(x) 
    (lambda(y) 
     (g x y)))) 

Я пытаюсь получить список чисел, не равных 1, используя функцию Карри.

То, что я до сих пор:

(define filter-numbers ((curry filter) 
         ((curry equal?) 1))) 

Но это только производит список чисел, равных 1.

отл. (список 1 2 3)) -> (список 1)

Я хочу получить (список 2 3), но понятия не имею, как это сделать. Может ли кто-нибудь помочь?

+2

Любая причина, по которой вы определяете свою собственную функцию карри? – mathk

ответ

4

Попробуйте это - правильный подход в рэкете, используя встроенный в curry и filter-not процедурах:

(define filter-numbers 
    (curry filter-not (curry equal? 1))) 

В качестве альтернативы, используя вашу Реализация curry:

(define filter-numbers 
    ((curry filter-not) 
    ((curry equal?) 1))) 

В любом случае, это работает как ожидалось:

(filter-numbers '(1 2 3 4 5 1 7 1)) 
=> '(2 3 4 5 7) 
1

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

0

Вы можете создать функцию мой-Compose следующим образом:

(define (my-compose f g) 
    (lambda (x) (f (g x)))) 

и с функцией Карри:

(define (curry g) 
    (lambda (x) (lambda (y) (g x y)))) 

Вы можете создать функцию фильтра (без использования фильтра-нет)

(define (filter-numbers lst) 
    (filter (my-compose not ((curry =) 1)) lst)) 


(filter-numbers (list 1 2 1 1 3 4 2)) => (list 2 3 4 2) 
Смежные вопросы