scala type system