RE: Help: Why no output?
- To: mathgroup at smc.vnet.net
- Subject: [mg34948] RE: [mg34941] Help: Why no output?
- From: "Wolf, Hartmut" <Hartmut.Wolf at t-systems.com>
- Date: Sat, 15 Jun 2002 02:27:30 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
> -----Original Message----- > From: kzhang at flashmail.com [mailto:kzhang at flashmail.com] To: mathgroup at smc.vnet.net > Sent: Friday, June 14, 2002 8:39 AM > Subject: [mg34948] [mg34941] Help: Why no output? > > > The behavior of the following function is puzzling to me: > > In[1]:=f[x_, n___Integer] := If[Length[{n}] == 1, n , Length[x]] > In[2]:=f[0.5] (* Nothing returned. *) > In[3]:=f[{1,2}] (* Nothing returned. The length of x should be > returned *) > (* However, with the modification to f, everything works as intended > *) > In[4]:=f[x_, n___Integer] := If[Length[{n}] == 1, 1*n , Length[x]] > ^^^^^^ > In[5]:=f[0.5] > Out[5]:=0 > In[6]:=f[{1,2}] > Out[6]:=2 > > Could anyone help me understand why changing n to (1*n) in the If[] > statement makes such difference? Why doesn't f[] defined in the In[1] > work? > > Thanks for your help. > > Kezhao Zhang > Kezhao, to resolve the puzzle we have to follow the evaluation sequence of e.g. f[0.5] (or equally well f[{1,2}], both cases are quite the same). So the decisive question is: what is the value of n___, when n is not given? ... ..well Pattern[n, BlankNullSequence[Integer]] just matches to the null sequence! ...now we have to ask what happens to the right side of the transformation rule? That's simple, just replace n by nothing f[0.5] --> If[Length[{}]==1, Length[0.5]] n just has disappeared from the expression! The condition becomes False, but the else-case is no more present, so Null is returned. That is the value of f[0.5], but that is not printed. This is much the same as Unevaluated[If[Length[{n}]==1, n, Length[x]]] /. n -> Sequence[] If you now consider that In[7]:= 1*Sequence[] Out[7]= 1 then you'll find the answer to your second question. -- Hartmut