Strictly speaking, you may not omit the *of*. It is not true that the argument **is** the type: it is an instance of the type, or an example of the type, or a member of the type. It is this sense of membership which is expressed by *of*. In speech or non-formal writing you can get away with omitting *of* in very simple constructions like this, where you just give the name of the type—*A is type B*. But with more complex constructions you cannot, even in informal contexts; you need *of* and a determiner: > <sup> ∗</sup>It expects the parameter to be type not yet defined. > <sup>OK</sup>It expects the parameter to be of a type not yet defined. > > <sup> ∗</sup>It expects the parameter to be type we encountered in section 3.4. > <sup>OK</sup>It expects the parameter to be of the type we encountered in section 3.4. When you're writing stuff like this you're probably using a fairly formal register. So why burden yourself with learning a different pattern for informal registers and having to decide each time how formal the immediate situation is and which one you should use? Use the formal construction all the time and you won't be wrong.