This is a follow up to this question.

So far, I named "explicit" heads to those that appear explicitly in the expression. For example, f[x] has an explicit head. I called "implicit" heads to those that are returned by Head but do not appear in the expression. For example, 5 has Integer as implicit head.

In the comments of the original question, rcollyer pointed out that the head of Complex[1,2] is explicit but f@@Complex[1,2] is not "decapitated" because AtomQ@Complex[1, 2] returns True. Then, I came up with the following code:

myAtom /: AtomQ[myAtom[__]] := True
f @@ myAtom[1, 2, 3]

How does Apply know when the head can be replaced?

According to the documentation of Apply:

Applying to atomic objects that do not have subparts effectively does nothing

Thus, it seems that checking with AtomQ is not enough. One should also check for the existence of parts. For example, Complex[1,2][[1]] returns an error but myAtom[1, 2, 3][[1]] does not. Incidentally, TreeForm[Complex[1, 2]] shows "parts".

Hence the question: Is there a function that makes both checks at once?

Follow up:

Is there any way to make a head non-decapitable?

Is there a statement similar to myAtom /: AtomQ[myAtom[__]] := True such that

Map[f, {1, {2, myAtom[3]}}, {-1}]

will return {f[1], {f[2], f[myAtom[3]]}}?

  • 1
    $\begingroup$ Length[expr]==0 is the test you're looking for, I think, but someone else would have to confirm that it always works. I don't know that much about this. I guessed it because it checks the criteria that you quoted and works for Complex. $\endgroup$
    – C. E.
    Nov 15, 2013 at 6:20
  • $\begingroup$ @Anon: Length[{}]==0 yet f@@{}==f[]. The original question seems now just a convoluted way towards Length[#] == 0 && AtomQ[#] &. $\endgroup$
    – Hector
    Nov 15, 2013 at 10:08
  • $\begingroup$ It is also true that Length@f[] == 0. :/ I don't think it's possible to create a fake atom. I hope someone proves me wrong. $\endgroup$
    – C. E.
    Nov 15, 2013 at 10:28


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Browse other questions tagged or ask your own question.