Семантика функции Mathematica Thread, кто-то должен наконец положить это на отдых
Wolfram Research имеет ту же самую документацию для этой функции за последние 8 лет:
Thread[f[args]]
"threads" f над любыми списками, которые появляются в args.
Прекрасное круговое определение, если я когда-либо видел его.
Кто-нибудь знает, что такое фактическая семантика, и может предоставить правильное объяснение, которое является некруглым?
Ответы
Ответ 1
Thread немного похож на обобщение zip
на другие функциональные языки.
Для простых случаев, когда все элементы args из вашего примера являются списками,
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 для построения списков правил или списков уравнений.
Ответ 2
Он работает аналогично функции 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]