Схема / Ракетка: транспонирование списков с картой и лямбда - PullRequest
0 голосов
/ 09 ноября 2018

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

Введите:

(list (list 1 5) (list 2 6) (list 3 7) (list 4 8)))

Выход:

(list (list 1 2 3 4) (list 5 6 7 8))

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

Может ли кто-нибудь дать мне полезную информацию?

Заранее большое спасибо.

1 Ответ

0 голосов
/ 09 ноября 2018

Это можно сделать в схеме / ракетке с

(apply map list (list (list 1 5) (list 2 6) (list 3 7) (list 4 8)))

который в DrRacket возвращает

'((1 2 3 4) (5 6 7 8))

По сути, вызов (apply map list <i>[a b c ... n]</i>)псевдокод ), это то же самое, что вызов

(map list a b c ... n)

Список аргументов "раскрыт" , так сказать.

(lambda x x) можно использовать и вместо list:

(apply map (lambda x x) (list ....... ))

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

Особый случай - (lambda x ...), где x не заключено в скобки. Это означает, что такая лямбда-функция может применяться к любому количеству аргументов, которые все будут собраны и переданы в в виде списка . Так что (lambda x x) будет действовать так же, как встроенный list, и может рассматриваться как его реализация.

И, кстати, это не «слияние», это «транспонирование».

...