PrintLN в SCALA для понимания

В соответствии с пониманием я не могу просто поставить оператор печати:

def prod (m: Int) = {
  for (a <- 2 to m/(2*3);
    print (a + "  ");
    b <- (a+1) to m/a;
    c = (a*b) 
    if (c < m)) yield c
}

, но я могу легко обойти его легко с манекенным заданием:

def prod (m: Int) = {
  for (a <- 2 to m/(2*3);
    dummy = print (a + "  ");
    b <- (a+1) to m/a;
    c = (a*b) 
    if (c < m)) yield c
}

быть побочным эффектом, и только используется только (до сих пор) в Код в разделе «Разработка», есть ли лучшее решение «Специальное решение»

. Есть ли серьезная проблема, почему я не должен использовать его, рядом со побочным эффектом?

Обновление, показывающее реальный код, где адаптация одного решения сложнее, чем ожидалось:

из обсуждения с Rex Kerr, необходимость выросла, чтобы показать исходный код, который немного сложнее, но не казалось, что Быть актуальным для вопроса (2x .filter, вызывая метод в конце), но когда я пытался применить рисунок Rex к нему, я потерпел неудачу, поэтому я публикую это здесь:

  def prod (p: Array[Boolean], max: Int) = {
    for (a <- (2 to max/(2*3)).
        filter (p);
      dummy = print (a + "  ");
      b <- (((a+1) to max/a).
         filter (p));
      if (a*b <= max)) 
        yield (em (a, b, max)) }

Вот моя попытка - (B * а) .Filter неверно, потому что результат является INT, а не фильтрующая коллекция INT:

  // wrong: 
  def prod (p: Array[Boolean], max: Int) = {
    (2 to max/(2*3)).filter (p).flatMap { a =>
      print (a + " ")
      ((a+1) to max/a).filter (p). map { b => 
        (b * a).filter (_ <= max).map (em (a, b, max))
      }
    }
  }

Часть II принадлежит к комментариям, но не может быть прочитано, если написано там - может быть, я удаляю его в конце. Прошу простить.

ОК - вот REX Последний ответ в коде макета:

  def prod (p: Array[Boolean], max: Int) = {
    (2 to max/(2*3)).filter (p).flatMap { a =>
      print (a + " ")
      ((a+1) to max/a).filter (b => p (b) 
        && b * a < max).map { b => (m (a, b, max))
      }
    }
  }
29
задан user unknown 24 November 2011 в 23:33
поделиться

2 ответа

Вот как это нужно написать:

scala> def prod(m: Int) = {
     |   for {
     |     a <- 2 to m / (2 * 3)
     |     _ = print(a + " ")
     |     b <- (a + 1) to (m / a)
     |     c = a * b
     |     if c < m
     |   } yield c
     | }
prod: (m: Int)scala.collection.immutable.IndexedSeq[Int]

scala> prod(20)
2 3 res159: scala.collection.immutable.IndexedSeq[Int] = Vector(6, 8, 10, 12, 14
, 16, 18, 12, 15, 18)
42
ответ дан 28 November 2019 в 01:36
поделиться

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

def prod(m: Int) = {
  (2 to m/(2*3)).flatMap { a =>
    print(a + " ")
    ((a+1) to m/a).map(_ * a).filter(_ < m)
  }
}

. Это также облегчает добавление операторов вывода и так далее.

2
ответ дан 28 November 2019 в 01:36
поделиться
Другие вопросы по тегам:

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