Является ли «карта» циклом? - PullRequest
39 голосов
/ 11 июня 2010

Отвечая на этот вопрос , я понял, что не уверен, можно ли считать Perl map циклом или нет?

С одной стороны, он крякает / ходиткак цикл (работает O (n), может быть легко переписан эквивалентным циклом, и в некотором роде соответствует общему определению = «последовательность инструкций, которая постоянно повторяется»).

Нас другой стороны, map обычно не указывается среди управляющих структур Perl, из которых циклы являются подмножеством.Например, http://en.wikipedia.org/wiki/Perl_control_structures#Loops

Итак, то, что я ищу, является формальной причиной, чтобы убедить одну сторону против другой.Пока что первое (это цикл) звучит для меня гораздо более убедительно, но меня беспокоит тот факт, что я никогда не видел "карту", упомянутую в списке циклов Perl.

Ответы [ 15 ]

2 голосов
/ 11 июня 2010

«Петля» - это скорее термин CS, а не язык. Вы можете быть достаточно уверены в том, что вызовите цикл, если он обладает следующими характеристиками:

  • перебирает элементы
  • каждый раз делает одно и то же
  • равно O(n)

map подходит для них довольно близко, но это не цикл, потому что это абстракция более высокого уровня. Можно сказать, что он обладает свойствами цикла, даже если сам он не является циклом в самом строгом смысле самого низкого уровня.

1 голос
/ 11 июня 2010

Я считаю, что карта более похожа на оператор, например, на умножение.Вы даже можете думать о целочисленном умножении как о цикле сложений :).Конечно, это не цикл, даже если бы он был тупо реализован таким образом.Я вижу карту аналогично.

1 голос
/ 11 июня 2010

Все зависит от того, как вы на это смотрите ...

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

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

0 голосов
/ 19 сентября 2014

Карта выглядит как петля, только если вы игнорируете lvalue.Вы не можете сделать это с помощью цикла for:

print join ' ', map { $_ * $_ } (1 .. 5)
1 4 9 16 25
0 голосов
/ 20 февраля 2013

Карта в Perl - это функция более высокого порядка, которая применяет данную функцию ко всем элементам массива и возвращает измененный массив.

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

Таким образом, карта не является циклом, хотя она может быть реализована с использованием цикла.

...