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

    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);
    }
    Ответ написан
    1 комментарий