I just started working with Mathematica and am toying with pattern matching. There may be something obvious I'm missing in this, but I can't figure it out by myself.
I want to write down a function that takes a complex number as arguments. So
f[1 + 2 I] should be a valid input, as well as
f[a + b I]. I want, however, to make my function parse this as two numbers of the form
a + bi, getting
b by pattern matching. I made several attempts similar to this:
f[a_ + b_ I] := NSolve[a^2 + b^2 == 1/2 (1 + z), z] SetAttributes[f, HoldAll]
(I guess the NSolve doesn't matter in this case, but let it there in case it's part of the issue.)
This doesn't work as I planned. Any attempt to call it, like
f[1 + 2 I], just echoes itself, but it does work fine when I call it with symbolic arguments, such as
f[a + b I].
I guessed this should be due to some difference in the internal representation of symbolic expressions and complex numbers. Indeed, whenever I try to
MatchQ[m + n I, a_ + b_ I], it says it's True. But when I try the sorts of
MatchQ[Unevaluated[2 + 3 I], a_ + b_ I], it's False.
In trying to figure it out, I asked
FullForm[a + b I] FullForm[Unevaluated[2 + 3 I]] FullForm[a_ + b_ I]
Plus[a,Times[Complex[0,1],b]] Unevaluated[Plus[2,Times[3,\[ImaginaryI]]]] Plus[Pattern[a,Blank],Times[Complex[0,1],Pattern[b,Blank]]]
My questions are:
- Shouldn't the
- What is the difference between
Complex[0,1]? I know the first is a symbol as much as
\[Alpha]is, and I guess me asking for Unevaluated is preventing it from being cast as a
Complex[0,1]. Probably this would be needed for the matching, but I don't know a workaround.
- Is there a better way to do what I'm attempting with my function?