Понимание вложенных массивов в CoffeeScript

#coffeescript #list-comprehension

#coffeescript #понимание списка

Вопрос:

В Python

 def cross(A, B):
   "Cross product of elements in A and elements in B."
   return [a b for a in A for b in B]
  

возвращает одномерный массив, если вы вызываете его с двумя массивами (или строками).

Но в CoffeeScript

 cross = (A, B) -> (a b for a in A for b in B)
  

возвращает двумерный массив.

  1. Как вы думаете, это сделано специально в CoffeeScript или это ошибка?
  2. Как мне сгладить массивы в CoffeScript?

Комментарии:

1. Это еще не решено github.com/jashkenas/coffee-script/issues/1191

Ответ №1:

Сначала я бы сказал, что 2 понимания массива в строке — это не очень поддерживаемый шаблон. Итак, давайте немного разберем это.

 cross = (A, B) ->
  for a in A
    for b in B
      a b

alert JSON.stringify(cross [1,2], [3,4])
  

Здесь происходит то, что внутренний создает замыкание, у которого есть свой собственный сборщик понимания. Таким образом, он запускает все b, затем возвращает результаты в виде массива, который загружается в родительский сборщик результатов понимания. Вы вроде как ожидаете возвращаемое значение из внутреннего цикла, что немного странно.

Вместо этого я бы просто собрал результаты самостоятельно.

 cross = (A, B) ->
  results = []
  for a in A
    for b in B
      results.push a   b
  results

alert JSON.stringify(cross [1,2], [3,4])
  

Или, если вы все еще хотели сотворить какую-нибудь сумасшедшую магию понимания:

 cross = (A, B) ->
  results = []
  results = results.concat a b for b in B for a in A
  results

alert JSON.stringify(cross [1,2], [3,4])
  

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

Комментарии:

1. «Сначала я бы сказал, скажем, что 2 понимания массива в строке like — это не очень поддерживаемый шаблон». — скажите это Питеру Норвигу 🙂 norvig.com/sudoku.py

2. Было бы неплохо, если бы в синтаксис была добавлена поддержка сглаженных результатов. Например, в синтаксис может быть введена запятая — a b for a in A,b in B

Ответ №2:

Комментарии:

1. джашкенас повторно открыл проблему 13 сентября 2011