Если у Вас есть Windows Vista или позже, щелкните правой кнопкой по значку папки в Проводнике при содержании клавиши Shift, и затем нажмите на опцию контекстного меню "Open command window here" или "Open PowerShell window here".
, Если Вы уже находитесь в папке, Вы хотите, можно выполнить одно из следующих действий:
Для Windows XP, используют PowerToy, упомянутый dF для получения той же функции.
Распространенной операцией во многих языках является присвоение индексированной позиции в массиве. В python вы можете:
>>> a = [1,2,3,4,5]
>>> a[3] = 9
>>> a
[1, 2, 3, 9, 5]
Пакет lens предоставляет эту функциональность с оператором (.~)
. Хотя в отличие от python исходный список не видоизменен, скорее возвращается новый список.
> let a = [1,2,3,4,5]
> a & element 3 .~ 9
[1,2,3,9,5]
> a
[1,2,3,4,5]
element 3 .~ 9
- это просто функция, а оператор (&)
, являющийся частью пакета lens , является просто приложением обратной функции. Вот оно с более распространенным применением функций.
> (element 3 .~ 9) [1,2,3,4,5]
[1,2,3,9,5]
Присвоение снова прекрасно работает с произвольным вложением Traversable
с.
> [[1,2,3],[4,5,6]] & element 0 . element 1 .~ 9
[[1,9,3],[4,5,6]]
или
> set (element 3) 9 [1,2,3,4,5,6,7]
Или, если вы хотите воздействовать на несколько элементов, вы можете использовать:
> over (elements (>3)) (const 99) [1,2,3,4,5,6,7]
> [1,2,3,4,99,99,99]
Это однако он не ограничивается списками, он будет работать с любым типом данных, который является экземпляром класса типов Traversable .
Возьмем, к примеру, ту же технику, работающую на деревьях , образующих стандартную упаковку контейнеров .
> import Data.Tree
> :{
let
tree = Node 1 [
Node 2 [Node 4[], Node 5 []]
, Node 3 [Node 6 [], Node 7 []]
]
:}
> putStrLn . drawTree . fmap show $ tree
1
|
+- 2
| |
| +- 4
| |
| `- 5
|
`- 3
|
+- 6
|
`- 7
> putStrLn . drawTree . fmap show $ tree & element 1 .~ 99
1
|
+- 99
| |
| +- 4
| |
| `- 5
|
`- 3
|
+- 6
|
`- 7
> putStrLn . drawTree . fmap show $ tree & element 3 .~ 99
1
|
+- 2
| |
| +- 4
| |
| `- 99
|
`- 3
|
+- 6
|
`- 7
> putStrLn . drawTree . fmap show $ over (elements (>3)) (const 99) tree
1
|
+- 2
| |
| +- 4
| |
| `- 5
|
`- 99
|
+- 99
|
`- 99
Этот ответ приходит довольно поздно, но я подумал, что поделюсь тем, что я считаю эффективным способом замены элемента nth
в списке в Haskell. Я новичок в Haskell и подумал, что смогу принять участие.
Функция set
устанавливает n-й элемент в списке на заданное значение:
set' :: Int -> Int -> a -> [a] -> [a]
set' _ _ _ [] = []
set' ind curr new arr@(x:xs)
| curr > ind = arr
| ind == curr = new:(set' ind (curr+1) new xs)
| otherwise = x:(set' ind (curr+1) new xs)
set :: Int -> a -> [a] -> [a]
set ind new arr = (set' ind 0 new arr)
Когда set
пересекает список, он разбивает список на части и, если текущим индексом является заданный n
, он объединяет предыдущий элемент с заданным новым значением, в противном случае он объединяет предыдущий элемент со старым значением в список для этого индекса.