Определение функции 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 так, чтобы его можно было использовать как бинарный оператор.
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости