Функция map на Пифагор

      Комментарии к записи Функция map на Пифагор отключены

Помечено: ,

В этой теме 0 ответов, 1 участник, последнее обновление  Васильев Владимир Сергеевич 1 неделя, 6 дн. назад.

  • Автор
    Сообщения
  • #4176

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

    // ((x1,x2,...,xn), f):map -> (x1:f, x2:f,...xn:f)
    map << funcdef X {
      List << X:1;
      Operation << X:2;
      return << (List:[]:Operation);
    }

    Для реализации такой функции на Пифагор достаточно исходный список преобразоваться в параллельный список, а затем применить к нему заданную операцию.

    Кроме того, в ряде языков и библиотек можно встретить аналогичную функцию, на вход которой передается несколько списков. При этом операция применяется к парам соответствующих элементов. Реализация на Пифагор:

    map3 << funcdef X {
      VectorA << X:1;
      VectorB << X:2;
      Operation << X:3;
      
      [((VectorA:|, VectorB:|):[!=, =]):?]^(
        "badVectorSize",
        {((VectorA , VectorB):#:[]:Operation)}
      ):. >> return;
    }

    При несовпадении длин исходных списков возвращается ошибка, иначе, с помощью операции транспонирования из исходных векторов формируется параллельный список пар (подробнее такое поведение описано в приложении 1.4 «Сравнение») к каждой из которых применяется заданная операция.

    С помощью описанных функций могут быть реализованы функции вычисления суммы и скалярного произведения векторов:

    // скалярное произведение векторов
    vec_mul << funcdef X {
      (X:1, X:2, *):map3 >> return;
    }
    
    // сумма векторов
    vec_sum << funcdef X {
      (X:1, X:2, +):map3 >> return;
    }

    Тесты для map и map3:

    test.map << funcdef {
      Cases << [
        ("unary_minus", ( ((1,2,3),-):map, (-1,-2,-3)):equals),
        ("sum_pairs", ( ( ((1,2),(3,4)), +):map, (3, 7)):equals)
      ];
      return << Cases;
    }
    
    test.map3 << funcdef {
      Cases << [
        ("good test", ( ((1,2),(3,4),*):map3, (3,8)):equals),
        ("wrong test", ( ((1,2), (3),*):map3 , "badVectorSize"):equals)
      ];
      return << Cases;
    }

Для ответа в этой теме необходимо авторизоваться.