LINUX.ORG.RU

История изменений

Исправление 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++ всё равно понятнее?