[swift-evolution] [Pitch] Small bit of sugar for enum case with Void associated value
Elviro Rocca
retired.hunter.djura at gmail.com
Wed Jul 26 02:23:29 CDT 2017
+1 to this
I not only support the case in question, but I 100% support any proposal that would push to compiler to completely remove any distinction from isomorphic tuples, by always reducing the tuple to the simplest form (this kind of discussion also took place in the thread about the SE110 rollback).
In case of:
enum Foo<T> {
case bar(T)
case baz()
}
if Foo<T>.bar is to be considered a function of type "(T) -> Foo<T>", and Foo<T>.baz a function of type "() -> Foo<T>", then when "T == ()" the two function must be considered of the same type, and there's no real reason from the user standpoint to consider them of different type.
And not just that, because in the case of:
enum Foo<T> {
case bar(Int,T)
case baz()
}
if "T == ()" the two functions should be respectively of type "(Int) -> Foo<()>" and "() -> Foo<()>", while the first one is currently of type "(Int,()) -> Foo<()>" which makes absolutely no sense.
A function that has a value of type "()" in the inputs makes no sense at all. The following function signature is meaningless and its avoidance should be enforced by the compiler
func wat(_ value: ()) -> Int {
return 42
}
let a = wat
let b = a() /// compiler error
The empty tuple should be automatically removed by the compiler for generics, or an error should be emitted in non-generic cases, simply because it is a singleton and it can always be produced out of thin air. It shouldn't be a valid argument of a function, and it should be stripped by any tuple like "(A,(),B)" or similar.
I made several more points in the SE110 discussion, and answered to most of the objections, so if you're interested you can read my answers there.
Thanks
Elviro
More information about the swift-evolution
mailing list