Given that types can be inferred, I prefer putting the type information later since whatever is first is more prominent, and usually you care at least as much what the variable is named as you care what its type is. (If you don't know your variable/method name, you can't use it!)
So that suggests to me that a postfix form like
is the way to go. It also has nicer ergonomics for methods where you need to care about return type more than anything else for most methods, and there it is right at the end next to where you're writing code that's going to return that type:
def foo(y: Int): Int = y+5
^ ^
| |
it should be Int and it is!
Now, for variables alone the colon is strictly optional in that the parsing is unambiguous even if it is omitted. However, for expressions, you need some way to indicate that you're trying to perform a type ascription, and if you allow singleton objects with the same names as classes (as Scala does), simply stating the name at the end is not clear.
So this leaves us with things like : Int and [Int].
Personally I like the idea of having type-world mirror value-world more closely, so I'd argue that
def foo[A](xs: List[A]): Int = ???
would be more regular as:
def foo[val A](xs [List(A)]) [Int] = ???
but since regularity does not always aid readability, I do not mind the irregularity of Scala syntax much.
(I do mind that you can't do stuff like [val A; val B; val C = A & B], but that's an orthogonal issue.)
--Rex