Необычный способ передачи параметров в Схеме - PullRequest
1 голос
/ 07 января 2012

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

(splitby '("a" "b" "cc" "ab" "abc" "a" "b")
         (lambda (x y) (= (string-length x) (string-length y))))

должен вернуть (("a" "b") ("cc "ab") ("abc") ("a" "b"))

Я довольно новичок в Scheme, поэтому очень сложно понять, как работает этот параметр "функция как", и что мне делать при реализации такой функции?

Ответы [ 2 ]

1 голос
/ 07 января 2012

Во-первых, в Схеме все внутри скобок. Так что если вы хотите применить функцию f к значениям x и y, вы пишете:

(f x y)

Так что вам просто нужно положить splitby в первый набор паренов.

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

(define (double x)
    (* x 2))

Я могу написать другую функцию, которая принимает double в качестве аргумента:

(define (change_result f x)
   (f (+ 3 x)))

; (change_result double 6) returns 18

Я могу сделать то же самое, если я использую лямбда (анонимную) функцию:

(change_result (lambda (x) (* 3 x)) 10)
1 голос
/ 07 января 2012

В Схеме функции - это объекты, такие как числа, строки и т. Д. Таким образом, в этом случае ваш пример эквивалентен следующему:

(define (equal-length x y)
  (= (string-length x) (string-length y)))

(splitby '("a" "b" "cc" "ab" "abc" "a" "b") equal-length)

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

Чтобы начать, напишите функцию group-equal, которая группирует равные элементы:

(define (group-equal lst)
  ...)

, где, например,

(group-equal '(1 2 2 3 3 3 4))

возвращает

((1) (2 2) (3 3 3) (4))

Если вы успешно это реализовали, то она идентична вашей splitby функции, за исключением того, что вы используете данную функцию (например, equal-length) вместо equal? (как group-equal может использовать).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...