Flatmap вложенные отображения - Lisp

Узнай цену своей работы

Формулировка задачи:

Есть вот такая интересная абстракция, которая называется flatmap. Есть ли какой-то перевод этой абстракции на русский язык? Я нагуглил, что flatmap есть в скале, но больше никакой информации об этом не нашел. Функция flatmap отображает данную последовательность при помощи функции proc и затем применяет накопление полученной последовательности, комбинируя элементы при помощи append. Я плохо понимаю, для чего это нужно. Эта процедура не работает с простыми процедурами proc типа умножения и сложение. Почему? Потому что append не умеет работать с несписочными значениями (числами)? Как можно представить себе рекурсивные вызовы flatmap при передаче сложных функций proc типа
(display (flatmap (lambda(i)
                        (map (lambda(j) (list i j))
                                (enumerate-interval 1 (- i 1))))
          (enumerate-interval 1 5)))
хотя бы на первых двух и последних двух вызовах? Здесь внешняя лямбда применяется к списку (enumerate-interval 1 5), а внутренняя лямбда для каждого i строит список чисел от 1 до i - 1. Что получается в результате каждой "итерации"? Как выглядят данные? Допустим, для числа 3 из списка (enumerate-interval 1 5) вызвана внешняя лямбда и получен список ((1 1) (1 2)). Аналогично строятся списки для всех других элементов (enumerate-interval 1 5). Что потом происходит при накоплении при помощи foldr?
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)

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.929 из 5
Похожие ответы