[swift-evolution] Inconsistencies in recursive types
Dimitri Racordon
Dimitri.Racordon at unige.ch
Mon Mar 13 09:38:14 CDT 2017
Oh yes you’re right.
I didn’t consider that case; thanks.
On 13 Mar 2017, at 15:34, rintaro ishizaki <fs.output at gmail.com<mailto:fs.output at gmail.com>> wrote:
FWIW, there *is* a way to instantiate #4 case.
class First {
let item: First
init(item: First) {
self.item = item
}
}
class Second : First {
init() {
super.init(item: self)
}
}
let a: First = Second()
2017-03-13 22:38 GMT+09:00 Dimitri Racordon via swift-evolution <swift-evolution at swift.org<mailto:swift-evolution at swift.org>>:
Hello swift-evolution,
I noticed there’s some inconsistencies with recursive types and how the compiler handles them. Consider the following cases:
1. Swift is right to refuse compiling this, since there’s no way to initialise an instance of `First `:
struct First {
let item: First
}
// Error: Value type 'First' cannot have a stored property that references itself
However, the message suggests more a compiler limitation rather than the actual impossibility to initialize the declared type.
2. Swift is also right not to compile this, but the error messages are even less insightful:
struct First {
let item: Second
}
// Error: Value type 'First' cannot have a stored property that references itself
struct Second {
let item: First
}
// Error: Value type 'Second' cannot have a stored property that references itself
The problem isn’t that the value types reference themselves. Instead, the problem is that there’s a cyclic dependency between `First` and `Second` that makes it impossible for neither of these structures to be instantiated.
3. Swift should let me do that:
struct First {
let item: First?
}
The compiler prevents me to declare the above struct, even if there actually is a way to initialise an instance of `First` (e.g. `First(item: nil)`). The message is identical to that of case #1 (maybe it actually is a compiler limitation after all?)
4. Swift shouldn’t compile this:
class First {
let item: First
init(item: First) {
self.item = item
}
}
Like in case #1, there’s no way to instantiate `First`. The fact that it’s a reference rather than a value doesn’t change the problem.
5. Similarly to case #4, Swift shouldn’t compile this:
indirect enum First {
case item(First)
}
6. Cases #4 #5 could be written like case #2, and should also raise compilation errors.
Does someone know if these issues have already been discussed and/or addressed?
Thanks,
Dimitri Racordon
_______________________________________________
swift-evolution mailing list
swift-evolution at swift.org<mailto:swift-evolution at swift.org>
https://lists.swift.org/mailman/listinfo/swift-evolution
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20170313/5d57b91b/attachment.html>
More information about the swift-evolution
mailing list