Не очень быстро для больших списков, но достаточно:
rotate :: Int -> [a] -> [a]
rotate n xs = iterate rot xs !! n
where
rot xs = last xs : init xs
Например:
> rotate 2 ["#","@","#","#"]
["#","#","#","@"]
Когда ваша программа завершится, вся память будет освобождена операционной системой.
Причина, по которой вы должны освободить ее самостоятельно, заключается в том, что память - это ограниченный ресурс в вашей запущенной программе. Конечно, в очень коротких простых программах отказ освободить память не будет иметь заметного эффекта. Однако в долго работающих программах неспособность освободить память означает, что вы будете потреблять ограниченный ресурс, не пополняя его. В конце концов он закончится, и ваша программа выйдет из строя. Вот почему вы должны освободить память.
Однако в долго работающих программах неспособность освободить память означает, что вы будете потреблять ограниченный ресурс, не пополняя его. В конце концов он закончится, и ваша программа выйдет из строя. Вот почему вы должны освободить память. Однако в долго работающих программах неспособность освободить память означает, что вы будете потреблять ограниченный ресурс, не пополняя его. В конце концов он закончится, и ваша программа выйдет из строя. Вот почему вы должны освободить память.При завершении программы вся память (освобожденная или нет) освобождается операционной системой. Тем не менее, по-прежнему хорошей практикой является освобождение всего, что вы выделяете - в основном для того, чтобы привыкнуть к этому, или в случае, если вы расширяете свою программу, чтобы она не заканчивалась там, где она была раньше.
На настольных ОС, таких как Windows, Linux или MacOS, ваша память будет очищен для вас.
В некоторых операционных системах реального времени или встроенных операционных системах он не будет очищен для вас.
Но это ' Хорошая идея всегда освобождать память, когда вы закончили с ней - помните, что пока ваша программа работает, вся эта память все еще используется. Если вы не освободите его, использование памяти на машине увеличится.
Вы также должны быть осторожны с рефакторингом - скажем, вы начинаете писать функцию main ()
, которая выделяет некоторую память , и вы не беспокоитесь о его освобождении, потому что ОС сделает это за вас. Но затем вы переносите этот код в функцию, которая вызывается много раз в течение длительного периода времени - внезапно возникает огромная утечка памяти.
Вы также должны быть осторожны с рефакторингом - скажем, вы начинаете писать функцию main ()
, которая выделяет некоторую память, и вы не беспокоитесь об ее освобождении, потому что ОС сделает это за вас . Но затем вы переносите этот код в функцию, которая вызывается много раз в течение длительного периода времени - внезапно возникает огромная утечка памяти.
Вы также должны быть осторожны с рефакторингом - скажем, вы начинаете писать функцию main ()
, которая выделяет некоторую память, и вы не беспокоитесь об ее освобождении, потому что ОС сделает это за вас . Но затем вы переносите этот код в функцию, которая вызывается много раз в течение длительного периода времени - внезапно возникает огромная утечка памяти.
Память освобождается ОС при завершении программы, но если все, что у вас есть, это небольшая утечка памяти, это меньше всего вас беспокоит.
Более проблематично: 1) если это происходит в цикле, ваша программа раздувается в размере и 2) в C ++, если ваши «новые» объекты ed не «удаляют» d, ваши деструкторы не запускаются, и это может привести к гораздо более серьезным проблемам ( утечка мьютекса или утечка ресурсов, НЕ очищенных ОС, проблемы с целостностью данных, список можно продолжить)
Важно правильно освободить память, чтобы инструменты, помогающие найти утечки памяти, давали значимый результат, когда и если вам нужно отследить проблемы. Разрешение ОС освободить для вас память добавит дополнительных шумов любым аналитическим инструментам, которые вы можете использовать позже. Даже если ОС вернет память системе, у вас должна быть надежная конструкция, которая правильно использует память и позволяет наилучшим образом использовать инструменты.