views:

268

answers:

2

Wolfram Research has had the same documentation for this function for the last 8 years at least:

Thread[f[args]]

"threads" f over any lists that appear in args.

A lovely circular definition if I've ever seen one.

Does anyone know what the actual semantics are and can provide a proper explanation that is non-circular?

+4  A: 

Thread is a bit like a generalization of a zipper from other functional languages.

For simple cases, where all the elements of args from your example are lists,

Thread[f[args]]

is equivalent to

f @@@ Transpose[{args}]

as shown in the first couple examples in the documentation. The major wrinkle is when you have args that are not lists, in which case they're effectively curried out; for example,

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

is equivalent to

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

I usually find myself using Thread to construct lists of rules or lists of equations.

Pillsy
+6  A: 

It works similarly to Python's zip() function, but in a slightly more general fashion. For example:

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]
Adam Rosenfield