Question: Type Declaration in Procedure

I have two problems with type declarations in procedures. They seem to be related, so I'll ask both questions at once.

1. One problem is that I make this sort of declaration.

{[n,N]::positive:=1}

where n could be an integer or a float, but not negative nor complex. I'm not sure what's wrong with the code below: the type-checking fails, but I don't understand why. I followed the template laid out by Preben here:
http://www.mapleprimes.com/questions/134550-Passing-The-Argument-Of-A-Procedure#comment134551

> restart;
> h1 := proc( { [n,N] :: {positive,identical(n)=positive} := 1 }
         , { [l,L] :: {list,identical(l)=list} := [1,1,1] } )
  local %n,%l;
  if type(n,positive) then %n:=n; else %n:=rhs(n); end if;
  if type(l,list) then %l:=l; else %l:=rhs(l); end if;
      print([n,whattype(n),is(n,positive)]);
      print([%n,whattype(%n),is(%n,positive)]);
      print([l,whattype(l)]);
      print([%l,whattype(%l)]);
end proc :

> h1(2,[1,2,3]); # Problem
                       [1, integer, true]
                       [1, integer, true]
                       [[1, 1, 1], list]
                       [[1, 1, 1], list]
> h1(2.,[1,2,3]); # Problem
                       [1, integer, true]
                       [1, integer, true]
                       [[1, 1, 1], list]
                       [[1, 1, 1], list]
> h1('n'=2,'l'=[1,2,3]); # Works
                       [2, integer, true]
                       [2, integer, true]
                       [[1, 2, 3], list]
                       [[1, 2, 3], list]
> h1('n'=2.,'l'=[1,2,3]); # Works
                       [2., float, true]
                       [2., float, true]
                       [[1, 2, 3], list]
                       [[1, 2, 3], list]

This is my source of information on types:

http://www.maplesoft.com/support/help/Maple/view.aspx?path=type%2fposneg

2. Another problem is that I'm writing something like:

{ [s,seed] := NULL} 

as one of my arguments, with the line

if s<>NULL then randomize(s): end if:

inside the procedure. It seemed like a good idea at the time to use NULL, but I realize now it was probably very silly. I can always fix this problem by selecting, say, 0 instead of NULL, but maybe there's a better way. The aim is to be able to optionally pass a value for the "seed" s into the procedure arguments, but also to ensure that if no value is passed then randomize(s) is not executed, even if s has (accidentally?) been assigned elsewhere in the worksheet (hence the need to assign s to some value in the declaration s:=something).

An aside: in the above I did not declare a type for NULL because I couldn't figure out what type NULL was, that is I thought that whattype would tell me what type NULL is, but then something strange happened:

whattype(NULL);
                            exprseq

but then when I tried the following declaration:


  , { [s,seed] :: {posint,exprseq} := NULL}


this happened:


Error, (in myProc) type `exprseq` does not exist
Please Wait...