type predicate narrowing