Подтвердить что ты не робот

Scala для понимания: жизненно важная особенность или синтаксический сахар?

Когда я впервые начал смотреть на Scala, мне понравился внешний вид для понимания. Казалось, что они немного похожи на петли foreach, с которыми я привык с Java 5, но с функциональными ограничениями и много приятной синтаксической привлекательности.

Но поскольку я впитал стиль Scala, я обнаружил, что каждый раз, когда я мог использовать for-comprension, я использую map, flatMap, filter, reduce и foreach вместо. Намерение кода кажется мне более ясным, с меньшим количеством потенциальных скрытых сюрпризов, и они, как правило, короче кода тоже.

Насколько мне известно, все-таки -понимание всегда скомпилировано в эти методы, поэтому мне интересно: на чем они на самом деле? Я пропустил какую-то функциональную ревальвацию (это будет не первый раз)? Разве для понимания понимаете, что другие функции не могут или, по крайней мере, будут намного более неуклюжими? Они сияют под конкретным прецедентом? Это действительно вопрос личного вкуса?

4b9b3361

Ответ 1

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

Ответ 2

Еще одно большое использование для понимания - для внутренней DSL. ScalaQL - отличный пример. Он может превратить этот

val underAge = for { 
  p <- Person 
  c <- Company 
  if p.company is c 
  if p.age < 14 
} yield p 

в этот

SELECT p.* FROM people p JOIN companies c ON p.company_id = c.id WHERE p.age < 14 

и многое другое.

Ответ 3

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

Когда я впервые начинал с Scala, я много использовал для понимания, потому что они были знакомы. Затем я почти полностью остановился, потому что я чувствовал, что использование базовых методов было более явным и, следовательно, более ясным. Теперь я вернусь к использованию понятий, потому что я думаю, что они лучше выражают намерение того, что я делаю, а не средства для этого.

Ответ 4

В некоторых случаях для понимания может выражаться намерение лучше, поэтому, когда они это делают, используйте их.

Также обратите внимание, что для понимания вы получаете бесплатное оформление шаблонов. Например, итерация по карте намного проще для понимания:

for ((key, value) <- map) println (key + "-->" + value)

чем с foreach:

map foreach { case (key, value) => println (key + "-->" + value) }

Ответ 5

Вы правы. Понимание - синтаксический сахар. Я считаю, что основные методы более сжаты и легче читать, как только вы привыкли к ним.

Сравните следующие эквивалентные утверждения:

1. for (i <- 1 to 100; if (i % 3 == 0)) yield Math.pow(i, 2)
2. (1 to 100).filter(_ % 3 == 0).map(Math.pow(_, 2))

По моему мнению, добавление точки с запятой в # 1 отвлекает от того, что это односвязное утверждение. Существует также ощущение, что я является var (это 1, или 99, или что-то между ними?), Что умаляет функциональный стиль в противном случае.

Вариант 2, очевидно, представляет собой цепочку вызовов методов для объектов. Каждая ссылка в цепочке четко заявляет о своей ответственности. Промежуточных переменных нет.

Возможно, для понимания включены в качестве удобства для разработчиков, переходящих с Java. Независимо от того, что выбрано, это вопрос стиля и предпочтения.