[swift-evolution] [Discussion] Zero-element tuple glitch
Austin Zheng
austinzheng at gmail.com
Sun Jul 3 17:41:36 CDT 2016
Void is just a typealias for (). () is the only type in Swift whose type and only instance are spelled the same way, as far as I can tell. This isn't true for Void, since Void is only a type, not the value.
As for the zero-argument/one-argument problem...how often does realistic code need to pass in a zero-argument function to a function type that takes one argument? If the answer is "often", we should consider what it would take to define an implicit conversion. Otherwise, maybe we can get away with a standard library adapter that can be used to wrap a () -> T as a U -> T (where U = () or something).
Austin
> On Jul 3, 2016, at 3:35 PM, Vladimir.S via swift-evolution <swift-evolution at swift.org> wrote:
>
> On 04.07.2016 0:47, Anton Zhilin via swift-evolution wrote:
>> Vladimir.S via swift-evolution <swift-evolution at ...> writes:
>>
>>> On 03.07.2016 23:53, Anton Zhilin via swift-evolution wrote:
>>>> let x = (Int, Int)(1, 2) //=> (1, 2)
>>>> let y = (Int)(1) //=> 1
>>>> let z = ()() // error :(
>>>>
>>>> Am I requesting too much from type checker?
>>>
>>> As I understand, because () is Void, you can't have anything additional
>> for
>>> it. It is just Void, like you write 'let z = Void Void'. I.e. only 'let
>> z =
>>> ()' allowed.
>>
>> In the example, that's how I expect that to parse:
>>
>> let z = ().init() // just demo, does not compile
>>
>> I mean, first () is type, and second () is its initializer.
>>
>> By the way, this is one thing that Void can do, but () cannot.
>> Are there any others?
>>
>
> I believe in this case () is playing a role of instance of type Void, i.e. empty tuple. I don't think you can expect ().init()
>
> Also:
> func f(_ x: ())->() {}
> f(())
> //f(Void) // argument passed to call that takes no arguments
>
> And just some fun:
>
> let x1 : Void
> //let x2 : Void = Void // cannot convert value of type 'Void.Type' (aka '().Type') to specified type 'Void' (aka '()')
> let x3 : ()
> let x4 : () = ()
> let x5 : Void = ()
> //let x4 : () = Void // cannot convert value of type 'Void.Type' (aka '().Type') to specified type '()'
>
> print(().dynamicType) // ()
> print(().self) // ()
> // print("Void.dynamicType = ", Void.dynamicType) // '.dynamicType' is not allowed after a type name
> print(Void.self) // ()
> print(().dynamicType == Void.self) // true
>
>
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution at swift.org
>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
More information about the swift-evolution
mailing list