Определение функции mconcat:
mconcat :: Monoid a => [a] -> a
mconcat = foldr mappend mempty
Реализация foldr:
template<typename F, typename T>
decltype(auto) foldr(F, T arg) { return arg; }
template<typename F, typename T, typename ...Ts>
decltype(auto) foldr(F f, T init, T head, Ts ...tail)
{
return f(head, foldr(f, init, tail...));
}
Реализация mconcat:
template<typename T, typename ...Ts>
decltype(auto) mconcat(T head, Ts ...tail)
{
return foldr(&mappend<T>, mempty<T>(), head, tail...);
}
Можно ли вместо функции foldr использовать fold-expressions? В описании указан необходимый вариант свертки - правая, с бинарным оператором, однако, я не могу придумать, каким образом можно заменить его на вызов функции mappend, или, наоборот, как реализовать wrapper для mappend так, чтобы его можно было использовать как бинарный оператор.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости