Flatmap вложенные отображения - Lisp
Формулировка задачи:
Есть вот такая интересная абстракция, которая называется flatmap. Есть ли какой-то перевод этой абстракции на русский язык? Я нагуглил, что flatmap есть в скале, но больше никакой информации об этом не нашел. Функция flatmap отображает данную последовательность при помощи функции proc и затем применяет накопление полученной последовательности, комбинируя элементы при помощи append. Я плохо понимаю, для чего это нужно. Эта процедура не работает с простыми процедурами proc типа умножения и сложение. Почему? Потому что append не умеет работать с несписочными значениями (числами)?
Как можно представить себе рекурсивные вызовы flatmap при передаче сложных функций proc типа
хотя бы на первых двух и последних двух вызовах? Здесь внешняя лямбда применяется к списку (enumerate-interval 1 5), а внутренняя лямбда для каждого i строит список чисел от 1 до i - 1. Что получается в результате каждой "итерации"? Как выглядят данные?
Допустим, для числа 3 из списка (enumerate-interval 1 5) вызвана внешняя лямбда и получен список ((1 1) (1 2)). Аналогично строятся списки для всех других элементов (enumerate-interval 1 5). Что потом происходит при накоплении при помощи foldr?
(display (flatmap (lambda(i) (map (lambda(j) (list i j)) (enumerate-interval 1 (- i 1)))) (enumerate-interval 1 5)))
bin/racket #lang scheme (define (enumerate-interval begin end) (if (> begin end) '() (cons begin (enumerate-interval (+ begin 1) end)))) (define (make-pairs n) (foldr append '() (map (lambda(i) (map (lambda(j) (list i j)) (enumerate-interval 1 (- i 1)))) (enumerate-interval 1 n)))) (define (flatmap proc seq) (foldr append '() (map proc seq))) (define (make-pair-sum pair) (list (car pair) (cadr pair) (+ (car pair) (cadr pair)))) (display (make-pairs 5)) (newline) (display (flatmap (lambda(i) (map (lambda(j) (list i j)) (enumerate-interval 1 (- i 1)))) (enumerate-interval 1 5))) (newline) (display (map make-pair-sum (flatmap (lambda(i) (map (lambda(j) (list i j)) (enumerate-interval 1 (- i 1)))) (enumerate-interval 1 5)))) (newline) (display (enumerate-interval 1 7)) (newline)
Решение задачи: «Flatmap вложенные отображения»
textual
Листинг программы
(mapcar #'f (remove-if-not #'p list)) ~ (mapcan (lambda (x) (if (p x) (list (f x)) '())) list)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д