But maybe we should consider generalizing this to type operators.  The '?' For 
optional could then be a postfix type operator.  And we could define our own 
type operators for type composition.  
Would you mind to provide a more detailed design from your perspective? I mean, 
how do you imagine `type<>` aka. `all<>` to look like with operators?

Any feedback is welcome. :)

-- 
Adrian Zubarev
Sent with Airmail

Am 13. Mai 2016 bei 17:05:29, Matthew Johnson (matt...@anandabits.com) schrieb:



Sent from my iPad

On May 13, 2016, at 9:21 AM, Tony Allevato via swift-evolution 
<swift-evolution@swift.org> wrote:

I think there would be a certain elegance to allowing Boolean type expressions 
wherever types are currently allowed, so `A & B` being a replacement for 
`protocol<A, B>` might look nice, and then extend that to allow concrete types 
as well. Then, if Swift ever decided to support union types, the `|` operator 
naturally fits there.

+1

But maybe we should consider generalizing this to type operators.  The '?' For 
optional could then be a postfix type operator.  And we could define our own 
type operators for type composition.  


One concern though would be whether parsing would get more complicated with 
deeply composed expressions. If we only supported `&`, there's no real nesting 
going on. But if we wanted to be forward thinking and leave the door open for 
`|`, we might need to support things like `(String | Int) & SomeProtocol`, and 
I'm not enough of a parser expert to know whether that would really complicate 
things (e.g., could the compiler decide easily enough that those parentheses 
are part of a type expression and not a function type?).

`all<A, B>` would be a nice compromise in that case, and leave the door open 
for `any<A, B>` in the future. So I'd be supportive of either option.

This makes sense as an immediate step in the right direction.  I like that it 
is more concise than protocol<>


On Thu, May 12, 2016 at 1:30 PM Jordan Rose via swift-evolution 
<swift-evolution@swift.org> wrote:
We've been over this a few times before on the list. I personally like naming 
this thing "Any<…>" in the same vein as "AnyObject", "AnyClass", and 
"AnySequence". I also see Thorsten (and in the past Brent's?) argument for 
calling it "all" or "All", because it's enforcing multiple constraints.

I will say that "type" is unlikely to see much traction simply because it is an 
incredibly common name for both properties and locals. We went through that 
exercise when trying to name both "static" and "dynamicType" and decided that 
it would be too confusing, even if we could make the parsing work.

The feature itself has definitely been shown to be useful when working with the 
Cocoa frameworks, if not in general. I don't see it on JIRA yet but we have it 
internally tracked in Radar as rdar://problem/15873071.

Jordan


On May 12, 2016, at 13:08, Adrian Zubarev via swift-evolution 
<swift-evolution@swift.org> wrote:

I don’t get the part how `all<>` should allow `any<>`. Could you explain that a 
little bit in detail (I’m not familiar with Ceylon)?

>From my point of view `any<>` is something different that I pitched here. 
>`any<>` could be proposed in its own thread, because it is way different than 
>`type<>`. Or can we refine the rules of `type<>` to get to `any<>`?

Here is a little example where `any<>` gets strange:

func foo(value: any<String, Int>) -> any<String, Int> {

    // how would one use value here?
    // what about its properties
    // what will foo return and how to use the result
}

One benefit of `any<>` is the replacement of overloading, at least for the type 
part of the function.

I’d like to propose `type<>` as the base extension to the language in that 
direction, before we’ll move forward with more complex scenarios (just like 
Chris did with generic typealias).

This function is clear that it only will work if you provide a subclass of an 
UIView which conforms to SomeProtocol (nice addition for library design).

func foo(value: type<UIView, SomeProtocol>) -> type<UIView, SomeProtocol> {

    // use it as a UIView and SomeProtocol at the same type
    return value // return type works great
}

We can split the value just fine:

let mergedValue = foo(SomeViewThatWorks)
let view: UIView = mergedValue
let protocolValue: SomeProtocol = mergedValue

And merge it back together:

guard let newMergedValue = view as? type<UIView, SomeProtocol> else { /* do 
something */ }

`all<>` could be seen as an alternative name for `type<>`, but to me its not 
clear what `all<>` can do, whereas `type<>` is almost like `protocol<>`.

-- 
Adrian Zubarev
Sent with Airmail

Am 12. Mai 2016 bei 21:40:24, Thorsten Seitz (tseit...@icloud.com) schrieb:

Ceylon uses „&" for intersection types, i.e.

SomeRealClass & SomeProtocol

and the bar („|“) for union types, i.e. 

String | Int

That has proven to be very lightweight and readable in Ceylon where it is 
heavily used to good effect.


I agree with you that

type<SomeRealClass, SomeProtocol> 

is much nicer than protocol<> for intersection types but to keep the door open 
for union types, I would prefer

all<SomeRealClass, SomeProtocol>

This would allow

any<String, Int>

to be used for union types.

-Thorsten


Am 12.05.2016 um 16:09 schrieb Adrian Zubarev via swift-evolution 
<swift-evolution@swift.org>:

protocol<SomeRealClass, SomeProtocol> 
protocol<SomeRealStruct, SomeProtocol> 

This feels really odd to me. 

`type<SomeRealClass, SomeProtocol>` is more clear I’d say.

I think this would be a good addition to the type system and allow us to build 
more complex and type save code.

But still I’d love to discuss if there might be any disadvantages to this 
feature.

-- 
Adrian Zubarev
Sent with Airmail

Am 12. Mai 2016 bei 15:11:00, Vladimir.S (sva...@gmail.com) schrieb:

protocol<> 
_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution
_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution
_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to