Scala - урожай может использоваться многократно с для цикла?

Это может произойти из-за выравнивания байта и дополнения так, чтобы структура вышла к четному числу байтов (или слова) на Вашей платформе. Например, в C на Linux, следующих 3 структурах:

#include "stdio.h"


struct oneInt {
  int x;
};

struct twoInts {
  int x;
  int y;
};

struct someBits {
  int x:2;
  int y:6;
};


int main (int argc, char** argv) {
  printf("oneInt=%zu\n",sizeof(struct oneInt));
  printf("twoInts=%zu\n",sizeof(struct twoInts));
  printf("someBits=%zu\n",sizeof(struct someBits));
  return 0;
}

Имеют участников, кто размеры (в байтах), 4 байта (32 бита), 8 байтов (2x 32 бита) и 1 байт (2+6 битов) соответственно. Вышеупомянутая программа (на Linux с помощью gcc) печатает размеры как 4, 8, и 4 - где последняя структура дополняется так, чтобы это было отдельное слово (4 байта на 8 битов на моей платформе на 32 бита).

oneInt=4
twoInts=8
someBits=4
17
задан Amir Raminfar 23 August 2011 в 17:02
поделиться

4 ответа

Непонятно, о чем вы просите - какой вы ожидаете от семантики множественного yield. Одна вещь, однако, заключается в том, что вы, вероятно, никогда не захотите использовать индексы для навигации по списку - каждый вызов t (i) - это O (i) для выполнения.

Итак, вот одна возможность, о которой вы могли бы просить

scala> val l = List(1,2,3); val t = List(-1,-2,-3)
l: List[Int] = List(1, 2, 3)
t: List[Int] = List(-1, -2, -3)

scala> val pairs = l zip t
pairs: List[(Int, Int)] = List((1,-1), (2,-2), (3,-3))

И вот еще одна возможность, о которой вы могли бы спросить

scala> val crossProduct = for (x <- l; y <- t) yield (x,y)
crossProduct: List[(Int, Int)] = List((1,-1), (1,-2), (1,-3), (2,-1), (2,-2), (2,-3), (3,-1), (3,-2), (3,-3))

Последний вариант - это просто синтаксический сахар для

scala> val crossProduct2 = l flatMap {x => t map {y => (x,y)}}
crossProduct2: List[(Int, Int)] = List((1,-1), (1,-2), (1,-3), (2,-1), (2,-2), (2,-3), (3,-1), (3,-2), (3,-3))

Третий вариант - вы хотите чередовать их

scala> val interleaved = for ((x,y) <- l zip t; r <- List(x,y)) yield r
interleaved: List[Int] = List(1, -1, 2, -2, 3, -3, 4, -4, 5, -5, 6, -6, 7, -7, 8, -8, 9, -9, 10, -10)

Это синтаксический сахар для

scala> val interleaved2 = l zip t flatMap {case (x,y) => List(x,y)}
interleaved2: List[Int] = List(1, -1, 2, -2, 3, -3, 4, -4, 5, -5, 6, -6, 7, -7, 8, -8, 9, -9, 10, -10)
22
ответ дан 30 November 2019 в 12:36
поделиться

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

Похоже для .. yield - это выражение. У вас не может быть двух выходов, поскольку это не является частью выражения.

Если вы хотите получить несколько значений, почему бы не выдать их в виде кортежа или списка?

Например:

for( t <- List(1,2,3); l <- List(-1,-2,-3))
  yield (t, l)
0
ответ дан 30 November 2019 в 12:36
поделиться

Нет, вы не можете использовать несколько предложений yield, но есть обходные пути. Например:

for (i <- 0 to 10;
     r <- List(l(i), t(i)))
yield r

Вы, конечно, можете вкладывать for-complation, но это приведет к списку списков элементов, который, я не думаю, вам нужен.

5
ответ дан 30 November 2019 в 12:36
поделиться

Может быть yield - не лучший вариант? Возможно, здесь можно было бы использовать простое добавление массива.

0
ответ дан 30 November 2019 в 12:36
поделиться
Другие вопросы по тегам:

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