История изменений
Исправление monk, (текущая версия) :
Так вот, если скопипастить реализации words и unwords (рекурсивно) в основной модуль, тогда можно заметить, что код на плюсах станет короче и понятнее кода на хаскелле.
В чистом виде
isSpace :: Char -> Bool
isSpace = (== ' ')
break :: (a -> Bool) -> [a] -> ([a],[a])
break _ xs@[] = (xs, xs)
break p xs@(x:xs') =
if p x
then ([],xs)
else let (ys,zs) = break p xs' in (x:ys,zs)
words :: String -> [String]
words s = case dropWhile isSpace s of
"" -> []
s' -> w : words s''
where (w, s'') = break isSpace s'
unwords :: [String] -> String
unwords [] = ""
unwords (w:ws) = w ++ go ws
where
go [] = ""
go (v:vs) = ' ' : (v ++ go vs)
revtext :: String -> String
revstr = unwords . reverse . words
revtext :: String -> String
revtext = unlines . map revstr . lines
Против (надо ли копипастить std::find, std::bind, std::equal_to, std::reverse?)
template <class BidirectionalIterator, class T>
void block_reverse_cpp11(BidirectionalIterator first, BidirectionalIterator last, T const& separator) {
std::reverse(first, last);
auto block_last = first;
do {
using std::placeholders::_1;
auto block_first = std::find_if_not(block_last, last,
std::bind(std::equal_to<T>(),_1, separator));
block_last = std::find(block_first, last, separator);
std::reverse(block_first, block_last);
} while(block_last != last);
}
std::for_each(begin(str1), end(str1), [](std::string& s){
block_reverse_cpp11(begin(s), end(s), ' ');
std::cout << s << std::endl;
});
Скажешь, версия на C++ всё равно понятнее?
Исходная версия monk, :
Так вот, если скопипастить реализации words и unwords (рекурсивно) в основной модуль, тогда можно заметить, что код на плюсах станет короче и понятнее кода на хаскелле.
В чистом виде
isSpace :: Char -> Bool
isSpace = (== ' ')
break :: (a -> Bool) -> [a] -> ([a],[a])
break _ xs@[] = (xs, xs)
break p xs@(x:xs') =
if p x
then ([],xs)
else let (ys,zs) = break p xs' in (x:ys,zs)
words :: String -> [String]
words s = case dropWhile isSpace s of
"" -> []
s' -> w : words s''
where (w, s'') = break isSpace s'
unwords :: [String] -> String
unwords [] = ""
unwords (w:ws) = w ++ go ws
where
go [] = ""
go (v:vs) = ' ' : (v ++ go vs)
revtext :: String -> String
revstr = unwords . reverse . words
revtext :: String -> String
revtext = unlines . map revstr . lines
Против
template <class BidirectionalIterator, class T>
void block_reverse_cpp11(BidirectionalIterator first, BidirectionalIterator last, T const& separator) {
std::reverse(first, last);
auto block_last = first;
do {
using std::placeholders::_1;
auto block_first = std::find_if_not(block_last, last,
std::bind(std::equal_to<T>(),_1, separator));
block_last = std::find(block_first, last, separator);
std::reverse(block_first, block_last);
} while(block_last != last);
}
std::for_each(begin(str1), end(str1), [](std::string& s){
block_reverse_cpp11(begin(s), end(s), ' ');
std::cout << s << std::endl;
});
Скажешь, версия на C++ всё равно понятнее?