Mathematica的Thread函数的语义,有人需要最终让它休息

时间:2009-08-08 23:22:08

标签: functional-programming wolfram-mathematica

至少过去8年,Wolfram Research已经为此功能提供了相同的文档:

Thread[f[args]]

“线程”f出现在args中的任何列表。

如果我见过一个可爱的循环定义。

有谁知道实际的语义是什么,并能提供非循环的正确解释?

2 个答案:

答案 0 :(得分:14)

它与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]

答案 1 :(得分:11)

线程有点像其他函数式语言的泛化zip

对于简单的情况,例子中args的所有元素都是列表,

Thread[f[args]]

相当于

f @@@ Transpose[{args}]

如文档中的前几个示例所示。主要的皱纹是当你有不是列表的args,在这种情况下它们被有效地用于咖喱;例如,

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

相当于

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

我经常发现自己使用Thread来构建规则列表或方程列表。