Идиоматический способ иметь много одинаковых генераторов в понимании списка

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

[(d1,d2,d3,d4) | d1 <- [1..6], d2 <- [1..6], d3 <- [1..6], d4 <- [1..6], (d1 + d2 + d3 + d4) == 10]

Это работает, как и ожидалось, давая мне вывод

[(1,1,2,6), (1,1,3,5), (1,1,4,4), (1,1,5,3), (1,1,6 , 2), (1,2,1,6), (1,2,2,5), (1,2,3,4), (1,2,4,3), (1,2,5 , 2), (1,2,6,1), (1,3,1,5), (1,3,2,4), (1,3,3,3), (1,3,4 , 2), (1,3,5,1), (1,4,1,4), (1,4,2,3), (1,4,3,2), (1,4,4 , 1), (1,5,1,3), (1,5,2,2), (1,5,3,1), (1,6,1,2), (1,6,2 , 1), (2,1,1,6), (2,1,2,5), (2,1,3,4), (2,1,4,3), (2,1,5 , 2), (2,1,6,1), (2,2,1,5), (2,2,2,4), (2,2,3,3), (2,2,4 , 2), (2,2,5,1), (2,3,1,4), (2,3,2,3), (2,3,3,2), (2,3,4 , 1), (2,4,1,3), (2,4,2,2), (2,4,3,1), (2,5,1,2), (2,5,2 , 1), (2,6,1,1), (3,1,1,5), (3,1,2,4), (3,1,3,3), (3,1,4 , 2), (3,1,5,1), (3,2,1,4), (3,2,2,3), (3,2,3,2), (3,2,4 , 1), (3,3,1,3), (3,3,2,2), (3,3,3,1), (3,4,1,2), (3,4,2 , 1), (3,5,1,1), (4,1,1,4), (4,1,2,3), (4,1,3,2), (4,1,4, 1), (4,2,1,3), (4,2,2,2), (4,2,3,1), (4,3,1,2), (4,3,2, 1), (4,4,1,1), (5,1,1,3), (5,1,2,2), (5,1,3,1), (5,2,1, 2), (5,2,2,1), (5,3,1,1), (6,1,1,2), (6,1,2,1), (6,2,1, 1)]

Вот тут и возникает мой вопрос. Ruby - большая часть моего опыта, поэтому я очень хорош в принципе DRY . Наличие d1 <- [1..6], d2 <- [1..6], d3 <- [1..6], d4 <- [1..6] в моем коде кажется ненужным, и я хочу верить, что есть лучший способ сделать это.

Как я понимаю, мой текущий метод работает, выпуская 4 вложенных цикла за кулисами - по одному для каждого генератора. Есть ли способ заставить один <- [1..6] генератор работать для всех переменных, эффективно создавая 4 вложенных цикла? Если нет, есть ли менее излишний или идиоматический способ написания этого кода для достижения того же результата?

Примечание: я довольно плохо знаком с языком, поэтому я прошу прощения, если это что-то, что должно быть очевидным. Если вы используете какие-либо слова / понятия, которые не были бы знакомы начинающему императивному / объектно-ориентированному программисту, попробуйте объяснить их мне.

8
задан Peril 18 October 2017 в 16:08
поделиться