RE: [F&O] 15.1 zero-or-one, one-or-more, exactly-one

> Section 15.1 Functions and Operators on Sequences defines the 
> functions  zero-or-one(), one-or-more(), exactly-one().
> 
> The function definitions are:
> 
>    fn:zero-or-one($srcval as item*) as item?
>    fn:one-or-more($srcval as item*) as item+
>    fn:exactly-one($srcval as item*) as item
> 
> 
> The main purpose of these functions is to raise an error if 
> the property they name is not true for the parameter-sequence. 
> 
> Such functions are not necessary and useful, because, had 
> their type been specified as:
> 
>    fn:zero-or-one($srcval as item?) as item?
>    fn:one-or-more($srcval as item+) as item+
>    fn:exactly-one($srcval as item) as item
> 
> then the error would be raised automatically if $srcval was 
> not of the correct type.

The problem arises when you are using a system that does (pessimistic)
static type checking. In this case, calling a function whose argument is
declared as element() with the actual argument book/author can give you a
type error even if you know that book/author will return a single element.
Calling the function with exactly-one(book/author) prevents the static type
system giving you an error (in much the same way as a treat expression). If
the type signature of exactly-one were as you suggest, then the function
would not serve its purpose, since the call exactly-one(book/author) would
again give you the static type error.

Michael Kay


> 
> Such automatic errors would be raised for any function when 
> passed parameters not matching the defined types of its 
> arguments -- therefore the above three functions are not 
> necessary at all.
> 
> Solution: remove the functions fn:zero-or-one(), fn:one-or-more() and
> fn:exactly-one()
> 
> 
> Dimitre Novatchev
> 
> 
> __________________________________
> Do you Yahoo!?
> Free Pop-Up Blocker - Get it now
> http://companion.yahoo.com/
> 

Received on Saturday, 22 November 2003 17:23:43 UTC