Какой смысл лямбды в схеме?

Ваш конструктор имеет локальную переменную int[] x, которая игнорируется в конце конструктора.

Попробуйте:

public class Square{
  // initialize to array of ten ints
  public int x[] = new int[10];

  public Square() {
    x[0] = 7;
  }

  public void root() {
    for (int i = 0; i < 10; i++) {
        x[i+1] = x[i] - (Math.pow(x[i] - 2.5, 2)) / (2 * (x[i] - 2.5));
        System.out.println(x[i + 1]);
    }
  }
}

Редактировать: int y является локальным для конструктора, оно также отбрасывается в конце области конструктора.

26
задан Brian Tompsett - 汤莱恩 27 November 2015 в 16:41
поделиться

5 ответов

A let is a lambda.

Например,

(let ((x 1))
  body)

можно перевести в

((lambda (x) body) 1)

Более того, в Scheme все управляющие и средовые структуры могут быть представлены лямбда-выражениями и приложениями лямбд.

Таким образом, лямбда является строго более мощной, чем let, и составляет основу многих интересных конструкций, встречающихся в Scheme.

Что касается define и lambda, то define верхнего уровня добавляет привязку к окружению верхнего уровня.

Когда вы пишете

(define (f x)
  body)

вы на самом деле говорите

(define f (lambda (x) body))

Вложенные определения переводятся в letrec, которые также могут быть переписаны с помощью лямбд.

Итак, повторюсь, многие конструкции Scheme могут быть переведены во что-то с помощью lambda, и поэтому вам действительно стоит хорошо понимать lambda.

44
ответ дан 28 November 2019 в 06:30
поделиться

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

Например, если вы хотите добавить 42 к каждому номеру в списке, вы можете сделать:

(define (add42 x) (+ x 42))
(map add42 (list 1 2 3 4))

Но если вы не хотите давать имя функции, которую вы используете только на этот раз, вы могли бы просто сделать:

(map (lambda (x) (+ x 42)) (list 1 2 3 4))
14
ответ дан sepp2k 28 November 2019 в 06:30
поделиться

В схеме процедура (или функция) - это объект первого класса, такой как список, число или строка. Для создания литерала списка вы используете примитив list:

> (define marks (list 33 40 56))
> marks
> (33 40 56)

Точно так же, чтобы создать процедуру, вы используете примитив lambda (или специальную форму):

> (define add-marks (lambda (m) (apply + m)))
> (add-marks marks)
> 129

Поскольку процедуры являются основной формой абстракции, Схема предоставляет ярлык для define, чтобы упростить привязку новых процедур:

> (define (add-marks m) (apply + m))

Кроме этого, процедуры как и все другие объекты первого класса. Они могут быть переданы в качестве аргументов другим процедурам, и процедура может оценить, чтобы произвести (или вернуть) другую процедуру.

3
ответ дан Vijay Mathew 28 November 2019 в 06:30
поделиться

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

1
ответ дан rabidmachine9 28 November 2019 в 06:30
поделиться

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

let создает временные имена для значений и устанавливается один раз для использования в области, определенной формой let.

Они действительно очень разные звери.

некоторые примеры:

(лямбда (x) (* 5 x))

(let ([x 2]) (* 5 x)) 10 (пусть ([f (lambda (x) (* 5 x))]) (f 2)) 10

первая форма создает функцию для умножения на 5

вторая форма присваивает 2 x и умножает ее на 5, в результате получается 10

третья мы используем функцию 1 (которая умножается на 5) и вызываем ее с помощью 2 в качестве параметра, что также дает 10

3
ответ дан 28 November 2019 в 06:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: