С функциональным программированием, используя fplus: ошибка при преобразовании вектора к вектору - PullRequest
0 голосов
/ 06 апреля 2020

Я занимаюсь функциональным программированием с использованием библиотеки fplus (https://github.com/Dobiasd/FunctionalPlus).

Заданный вектор векторов строк

const std::vector<std::vector<std::string>> singleGradeStatisticPairsAsStr = { {"10", "1"}, {"20", "2"}, {"30", "3"} };

предполагается преобразовать в вектор вектора целых.

Используя итеративный стиль, это можно реализовать как

std::vector<std::vector<int>> singleGradeStatisticPairs;
for (auto singleGradeStatisticPair : singleGradeStatisticPairsAsStr) {
    std::vector<int> singleGradeStatisticPairAsInt;
    for (auto element : singleGradeStatisticPair) {
        singleGradeStatisticPairAsInt.push_back(str_to_number<int>(element));
    }
    singleGradeStatisticPairs.push_back(singleGradeStatisticPairAsInt);
}

, который работает правильно. Распечатка результата с помощью

std::cout << "singleGradeStatisticPairs:" << fplus::show(singleGradeStatisticPairs) << std::endl;

приводит к правильной распечатке singleGradeStatisticPairs:[[10, 1], [20, 2], [30, 3]].

Теперь я попытался реализовать это в функциональном стиле как

auto singleGradeStatisticPairs = fplus::transform(
    fplus::fwd::transform(str_to_number<int>), singleGradeStatisticPairsAsStr);

Это дает мне ошибка компилятора:

E0304:  no instance of function template "fplus::transform" matches the argument list   

Как правильно решить проблему, используя функциональное программирование? Вышеприведенный шаблон прекрасно работал для возведения квадратов в вектор векторов:

std::vector<std::vector<int>> xxs = { {1, 2, 3}, {4, 5, 6} };
auto yys = fplus::transform(fplus::fwd::transform(fplus::square<int>), xxs);
std::cout << "yys:" << fplus::show(yys) << std::endl;

скомпилирован без ошибок и дал правильную распечатку

yys:[[1, 4, 9], [16, 25, 36]]

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

// API search type: square : a -> a
// fwd bind count: 0
// Returns the square (x*x) of a value x.
template <typename X>
X square(X x)
{
    return x * x;
}

от https://github.com/Dobiasd/FunctionalPlus/blob/781172829659301f15f219fc569ff4add3880c83/include/fplus/numeric.hpp

и мой собственный код

template <typename T>
T str_to_number(std::string& aString) {
    T number;
    std::stringstream(aString) >> number;
    return number;
}

Обновление: я переопределил свое определение str_to_number, используя вызов по значению, поэтому заголовок функции равен T str_to_number(std::string aString). Теперь преобразование работает просто отлично, используя функциональный подход - по-видимому, вызов по ссылке. проблема «вызов по значению» - здесь проблема, а не функциональное программирование.

Есть ли способ, где я мог бы использовать ссылки для строк здесь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...