Семантика функции Thread в Mathematica, кто-то должен наконец положить это на отдых - PullRequest
14 голосов
/ 09 августа 2009

Wolfram Research имеет ту же документацию для этой функции как минимум за последние 8 лет:

Thread[f[args]]

"темы" f над любыми списками, которые появляются в аргументах.

Прекрасное круглое определение, если я когда-либо видел.

Кто-нибудь знает, что такое настоящая семантика, и может дать правильное объяснение, которое не является круговым?

Ответы [ 2 ]

14 голосов
/ 09 августа 2009

Работает аналогично функции Python zip(), но в несколько более общем виде. Например:

In[1] := Thread[{{1, 2, 3}, {4, 5, 6}}]  (* f == List *)
Out[1] = {{1, 4}, {2, 5}, {3, 6}}

In[2] := Thread[f[{1, 2, 3}, {4, 5, 6}]]
Out[2] = {f[1, 4], f[2, 5], f[3, 6]}

In[3] := Thread[f[a+b+c, d+e+f], Plus]
Out[3] = f[a, d] + f[b, e] + f[c, f]
11 голосов
/ 09 августа 2009

Поток немного похож на обобщение zip из других функциональных языков.

Для простых случаев, когда все элементы аргументов из вашего примера являются списками,

Thread[f[args]]

эквивалентно

f @@@ Transpose[{args}]

, как показано в первой паре примеров в документации. Основная проблема - когда у вас есть аргументы, которые не являются списками, и в этом случае они эффективно вычеркиваются; например,

Thread[g[{a, b}, c, {d, e}, f]]

эквивалентно

g[#1, c, #2, f]& @@@ Transpose[{{a, b}, {d, e}}]

Обычно я использую Thread для построения списков правил или списков уравнений.

...