It's not inconsistent, just terser. You could say that "fn" declares a function by name; the type of foo is int -> str.
In Haskell, this is written:
foo :: int -> str
Of course, Haskell is based on lambda calculus, so multiple arguments are just a generalization of partial function application:
foo :: int -> int -> str
(A function taking two int arguments and returning a string, which is indistinguishable from a function that takes a single int and returns a function that takes a single int and returns a string.)
In Haskell, this is written:
Of course, Haskell is based on lambda calculus, so multiple arguments are just a generalization of partial function application: (A function taking two int arguments and returning a string, which is indistinguishable from a function that takes a single int and returns a function that takes a single int and returns a string.)