Тест C ++ для проверки соответствия оператора равенства со структурой с течением времени

Если у Вас есть Windows Vista или позже, щелкните правой кнопкой по значку папки в Проводнике при содержании клавиши Shift, и затем нажмите на опцию контекстного меню "Open command window here" или "Open PowerShell window here".

, Если Вы уже находитесь в папке, Вы хотите, можно выполнить одно из следующих действий:

  • [только Win8 +] Нажимают кнопку Explorer Ribbon's File, затем нажимают на "Open command window here" или "Open PowerShell window here".
  • Сдвиг - щелкает правой кнопкой по фону окна Explorer, затем нажимает на "Open command window here" или "Open PowerShell window here". (рекомендуемый Kate в комментариях)
  • [только Vista или Win7] Удерживают Сдвиг при открытии меню Explorer File, затем нажимают на "Open command window here". Если Вы не видите строку меню, открываете меню File путем нажатия Высокого звука - Сдвига - F - Высокого звука - F для открытия меню File плюс Сдвиг .

Для Windows XP, используют PowerToy, упомянутый dF для получения той же функции.

24
задан HaskellElephant 2 May 2011 в 08:02
поделиться

2 ответа

Изменение n-го элемента

Распространенной операцией во многих языках является присвоение индексированной позиции в массиве. В 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
29
ответ дан 28 November 2019 в 22:09
поделиться

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

0
ответ дан 28 November 2019 в 22:09
поделиться
Другие вопросы по тегам:

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