Как реализовать функцию map?

Помогите пожалуйста разобраться в функции map. Что она из себя представляет? Как ее реализовать и с чем ее едят в си?

l=[a_1,..,a_n] – некоторый список элементов типа T, а f:T→T, то:
map(f,l)↦[f(a_1 ),..,f(a_n )]

Непонятно, что она делает и как ее реализовать.
  • Вопрос задан
  • 1501 просмотр
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
l=[a_1,..,a_n] – некоторый список элементов типа T, а f:T→T, то:
map(f,l)↦[f(a_1 ),..,f(a_n )]
Не понятно что она делает и как ее реализовать.


Почему непонятно что делает? Вы же сами написали: применяет функцию f к каждому элементу входного списка.
Как её реализовать -- зависит от представления списка, от того, насколько строго хочется обойтись с типами и от того, насколько хочется следовать стандарту.
Например, можно сделать так:
#include <stddef.h>

struct list {
    struct list *next;
};

struct list *map(void f(struct list *p), struct list *l)
{
    struct list *i;
    for (i = l; i != NULL; i = i->next)
        f(i);
    return l;
}

struct list_int {
    struct list list;
    int i;
};

void process_int(struct list *l)
{
    struct list_int *p = (struct list_int *)l;
    ++p->i;
}

int main()
{
    struct list_int l[] = {
        [0] = {
            .list.next = &l[1].list,
            .i = 1,
        },
        [1] = {
            .i = 2,
        },
    };
    map(process_int, &l[0].list);
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы