Как переместить элемент в список в Haskell?

Повышение включает удобный алгоритм для этого:

#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
}
6
задан Don Stewart 17 April 2011 в 21:25
поделиться

5 ответов

Я бы сделал это так:

move n as = head ts : (hs ++ tail ts)
   where (hs, ts) = splitAt n as

splitAt разбивает список в заданной позиции, он возвращает две части, которые создаются в результате разделения (здесь hs и ts ). Элемент, который нужно переместить вперед, теперь находится в начале ts . head ts возвращает только этот первый элемент ts , tail ts возвращает все , кроме этого первого элемента. Результатом функции являются как раз эти части, объединенные в правильном порядке:

15
ответ дан 8 December 2019 в 02:27
поделиться

Опытные хаскеллеры почти никогда не используют индексирование списков. Я бы использовал 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]
11
ответ дан 8 December 2019 в 02:27
поделиться

небольшая модификация решения sth:

toHead n xs = x : pre ++ post
  where (pre, x:post) = splitAt n xs

с использованием сопоставления с образцом вместо head n tail

8
ответ дан 8 December 2019 в 02:27
поделиться

Какое совпадение?
Несколько дней назад я читал то же самое. Посмотрел еще раз и написал примерно так.

nums !! 3 : [x | x <- nums, (x == (num !! 3)) == False]
0
ответ дан 8 December 2019 в 02:27
поделиться

Также есть

toHead n l = l !! n : take n l ++ drop (n+1) l

, за которым может быть немного легче следить, чем при использовании splitAt .

3
ответ дан 8 December 2019 в 02:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: