Повышение включает удобный алгоритм для этого:
#include <boost/algorithm/string.hpp>
// Or, for fewer header dependencies:
//#include <boost/algorithm/string/predicate.hpp>
std::string str1 = "hello, world!";
std::string str2 = "HELLO, WORLD!";
if (boost::iequals(str1, str2))
{
// Strings are identical
}
Я бы сделал это так:
move n as = head ts : (hs ++ tail ts)
where (hs, ts) = splitAt n as
splitAt
разбивает список в заданной позиции, он возвращает две части, которые создаются в результате разделения (здесь hs
и ts
). Элемент, который нужно переместить вперед, теперь находится в начале ts
. head ts
возвращает только этот первый элемент ts
, tail ts
возвращает все , кроме этого первого элемента. Результатом функции являются как раз эти части, объединенные в правильном порядке:
Опытные хаскеллеры почти никогда не используют индексирование списков. Я бы использовал break, чтобы избежать повторных обходов (при условии, что вы хотите сопоставить элемент '4', а не индекс '3'):
case break (== 4) [1, 2, 3, 4, 5] of
(a,x:xs) -> x:a ++ xs
(a,xs) -> a ++ xs
Как в:
Prelude Data.List> case break (== 4) [1, 2, 3, 4, 5] of (a,x:xs) -> x:a ++ xs; (a,xs) -> a ++ xs
[4,1,2,3,5]
Мы можем сделать то же самое с индексированием через 'splitAt':
Prelude Data.List> case splitAt 3 [1, 2, 3, 4, 5] of (a,x:xs) -> x:a ++ xs; (a,xs) -> a ++ xs
[4,1,2,3,5]
небольшая модификация решения sth:
toHead n xs = x : pre ++ post
where (pre, x:post) = splitAt n xs
с использованием сопоставления с образцом вместо head
n tail
Какое совпадение?
Несколько дней назад я читал то же самое. Посмотрел еще раз и написал примерно так.
nums !! 3 : [x | x <- nums, (x == (num !! 3)) == False]
Также есть
toHead n l = l !! n : take n l ++ drop (n+1) l
, за которым может быть немного легче следить, чем при использовании splitAt
.