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