Haskell заменит элемент в списке

Есть ли встроенная функция для замены элемента в указанном индексе в haskell?

Пример:

replaceAtIndex(2,"foo",["bar","bar","bar"])

Должен дать:

["bar", "bar", "foo"]

Я знаю, что могу сделать свою собственную функцию, но кажется, что она должна быть встроена.

Ответы

Ответ 1

Если вам нужно обновлять элементы по определенному индексу, списки не являются лучшей структурой данных для этого. Возможно, вы захотите использовать Seq из Data.Sequence, и в этом случае функция, которую вы ищете, это update :: Int -> a -> Seq a -> Seq a.

> import Data.Sequence
> update 2 "foo" $ fromList ["bar", "bar", "bar"]
fromList ["bar","bar","foo"]

Ответ 2

Насколько я знаю (и могу найти), он не существует по умолчанию. Однако существует splitAt в Data.List так:

replaceAtIndex n item ls = a ++ (item:b) where (a, (_:b)) = splitAt n ls

Это O (N). Если вы обнаружите, что делаете это много, посмотрите на другой тип данных, например массив.

Ответ 3

Существуют реальные массивы, но списки - это действительно односвязные списки, а понятие замены элемента не так очевидно (и доступ к элементу в указанном индексе может указывать на то, что вы не должны использовать список, поэтому операции которые могут поощрять его избегать).