[swift-evolution] Proposal: newtype feature for creating brand new types from existing types

Alejandro Martinez alexito4 at gmail.com
Fri Dec 11 14:38:36 CST 2015


> Anyway, about the general thing: isn’t this just inheritance, but then for struct types?
> i.e.
> 
> struct Bar : Double {}


Not exactly as inheritance will let you use Bar in any place where do you expect Double. 
Presumably newtype does not. 


> El 11 dic 2015, a las 20:34, Nicky Gerritsen via swift-evolution <swift-evolution at swift.org> escribió:
> 
>> 
>> On 11 dec. 2015, at 21:30, Gwendal Roué via swift-evolution <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>> 
>> Considering the number of times I’ve read about this topic in other languages, I must agree :-)
>> 
>> Yet there are two difficulties:
>> 
>> First, what does Bar get from Double ?
>> 
>> When you say "after creating Bar, I can extend Bar independenly of Double", the problem lies in the meaning of "after". In a language like Ruby, there is an "after", but there is no such clear thing in Swift: modules/packages are compiled as a whole, and module A can extend a type defined the the module B.
>> 
>> More, let’s see what happens below:
>> 
>> 1	let d: Double = 1.0
>> 2	let b: Bar = d			// Compiler error, I presume.
>> 3	let b: Bar = Bar(d)		// Mandatory so that Bar can be put to any use
>> 4	let b: Bar = 1.0
>> 
>> That point 4 is tricky.
>> 
>> If it is not an error, then 2. should succeed as well, don’t you think?
>> If it is an error, then one may want to add FloatLiteralConvertible to Bar. Oops, Double already implements it.
> But that is not true. Take this example:
> 
> let x: Int = 3 // Type added for clarity
> let y: Double = x // error
> let z: Double = 3 // ok
> 
> This is exactly why it is Float_Literal_Convertible, it can only convert literals ;).
> 
> Anyway, about the general thing: isn’t this just inheritance, but then for struct types?
> i.e.
> 
> struct Bar : Double {}
> 
> — Nicky
>> 
>> Hm. I’m afraid I haven’t found the solution :-)
>> 
>> Gwendal Roué
>> 
>>> Le 11 déc. 2015 à 21:09, Tuur Anton via swift-evolution <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> a écrit :
>>> 
>>> //Existing typealias feature.
>>> //Foo acts exactly the same way as Double. It's the same thing.
>>> //Double can be used instead of Foo anywhere.
>>> typealias Foo = Double
>>> 
>>> //Proposed newtype feature.
>>> //Bar acts exactly the same way as Double and  is the same
>>> //thing behind the scenes (until we extend it; see below).
>>> //Trying to use Double instead of Bar will result in a compile-time error.
>>> newtype Bar = Double
>>> 
>>> Of course, after creating Bar - a "copy" of the type Double, so to speak - I can extend Bar independenly of Double as one would expect.
>>> 
>>> This would be highly useful.
>>> 
>>> Your thoughts?
>>> 
>>> _______________________________________________
>>> swift-evolution mailing list
>>> swift-evolution at swift.org <mailto:swift-evolution at swift.org>
>>> https://lists.swift.org/mailman/listinfo/swift-evolution <https://lists.swift.org/mailman/listinfo/swift-evolution>
>> 
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution at swift.org <mailto:swift-evolution at swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-evolution <https://lists.swift.org/mailman/listinfo/swift-evolution>
> 
>  _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org <mailto:swift-evolution at swift.org>
> https://lists.swift.org/mailman/listinfo/swift-evolution <https://lists.swift.org/mailman/listinfo/swift-evolution>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20151211/23bf6519/attachment.html>


More information about the swift-evolution mailing list