[swift-evolution] [pitch] Eliminate the "T1 -> T2" syntax, require "(T1) -> T2"

David Owens II david at owensd.io
Fri Apr 15 19:04:49 CDT 2016

> On Apr 15, 2016, at 1:07 PM, Chris Lattner <clattner at apple.com> wrote:
>> On Apr 15, 2016, at 11:27 AM, David Owens II <david at owensd.io <mailto:david at owensd.io>> wrote:
>> Hmm... I don't think this is clearer:
>>     let fn: (Int) -> (Int) -> Int
>> I think it's much less readable and really, the () are syntactically redundant: the -> is really what distinguishes this as a function.
>> Also, this would look like a error now:
>>     let fn: (Int) -> ()
>> Did the user mean that it returns nothing, or did they forget the rest of the function signature?
> Hi David,
> I’m not sure what you’re saying here.  The two types above are already valid, and this proposal doesn’t affect that.
> -Chris

At the core, I guess it’s just a dislike of the different behaviors for function declarations in the system in general. Your propose just exposes a weirdness with empty parameter lists and the typealias for void: ().

It’s a bit odd that the () mean different things depending on the side of the “->” they are on. The left side is an empty parameter list, the right side is a void type.

Now, I get your argument is to get rid of the difference between:

    let f: Int -> ()
    let g: (Int, Int) -> ()

I guess I’m more of the opinion of David Hart, this change should also remove the typealias for () being void.

    let f: (Int) -> Void
    let g: (Int, Int) -> Void

Overall, I think the change is ok, but doesn’t really add any significant clarity to function declarations. I feel like there are already a lot of weirdness in general around them.


typealias Functor = (to: Int, from: Int) -> Int
let g: (hi: Int, bye: Int) -> Int = { $0 - $1 }

func sum(x: Int, y: Int) -> Int {
    return x + y

func mult(x: Int, y: Int) -> Int {
    return x * y

func f(n: Int, _ m: Int, _ c: Functor) -> Int {
    return c(to: n, from: m)

f(1, 2, sum)    // output: 3
f(1, 2, mult)   // output: 2
f(1, 2, g)      // output: -1

It’s weird to me that we can essentially erase the parameter names and fallback to just the type signatures, but that can be a talk for another day.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160415/13ad62de/attachment.html>

More information about the swift-evolution mailing list