Каково различие между монадой и закрытием?

Используйте itertools.product для получения списка точек, который эквивалентен декартову произведению диапазонов каждой координаты:

>>> list(itertools.product(range(3), range(3), range(3)))
[(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 1, 0), (0, 1, 1), (0, 1, 2), (0, 2, 0), 
 (0, 2, 1), (0, 2, 2), (1, 0, 0), (1, 0, 1), (1, 0, 2), (1, 1, 0), (1, 1, 1), 
 (1, 1, 2), (1, 2, 0), (1, 2, 1), (1, 2, 2), (2, 0, 0), (2, 0, 1), (2, 0, 2), 
 (2, 1, 0), (2, 1, 1), (2, 1, 2), (2, 2, 0), (2, 2, 1), (2, 2, 2)]

Вы также можете объединить все 6 координат в один генератор:

coords = itertools.product(range(Nk), range(Nk), range(Nk), range(Ns), range(Ns), range(Ns))
for kz, ky, kx, rz, ry, rx in coords:
    k, r = Nk * (Nk * kz + ky) + kx, Ns * (Ns * rz + ry) + rx
    dot_product = kx * rx + ky * ry + kz * rz
    k_box[k], R_box[r] = perform_some_calculation(dot_product)

В качестве альтернативы, чтобы избежать расчета индекса, используйте enumerate:

for k, (kz, ky, kx) in enumerate(itertools.product(range(Nk), range(Nk), range(Nk))):
    for r, (rz, ry, rx) in enumerate(itertools.product(range(Ns), range(Ns), range(Ns))):
        dot_product = kx * rx + ky * ry + kz * rz
        k_box[k], R_box[r] = perform_some_calculation(dot_product)
9
задан user63657 26 April 2009 в 11:57
поделиться

4 ответа

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

21
ответ дан 4 December 2019 в 08:02
поделиться

Они довольно разные, хотя монады будут часто использовать замыкания для захвата логики.

Лично я бы попытался получить четкое представление об определении замыканий (по сути, часть логики, которая также фиксирует свое окружение, т.е. локальные переменные и т. д.), прежде чем беспокоиться о монадах. Они могут появиться позже:

Существуют различные вопросы о замыканиях в переполнении стека - лучший способ помочь вам будет зависеть от того, на какой платформе вы работаете. Например, есть:

Лично я только начинаю «лаять» монады (благодаря книге, в которой я помогаю ). Однажды я перейду к написанию статьи о них, когда почувствую, что достаточно хорошо их понимаю :)

5
ответ дан 4 December 2019 в 08:02
поделиться

«Замыкание» - это объект, содержащий 1) функцию и 2) значения ее свободных переменных, в которых она сконструирована.

«Монада» - это класс функций, которые могут быть составленным определенным образом, то есть с использованием связанных bind и return операторов функций высшего порядка для создания других функций.

1
ответ дан 4 December 2019 в 08:02
поделиться

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

0
ответ дан 4 December 2019 в 08:02
поделиться