Hi John and Brent, 

> On 14 Apr 2016, at 22:22, John McCall <rjmcc...@apple.com> wrote:
> 
> multiple-conformance idea doesn't work


The idea is not multiple-conformance (or overloading), but multiple (two) 
initialisers required by the literal-convertible protocols:

protocol TreeLiteralConvertible {
        associatedtype LeafValue
        init(literal: Self.LeafValue...)
        init(literal: Self...)
}

… and:

protocol DictionaryTreeLiteralConvertible {
        associatedtype Key
        associatedtype LeafValue
        init(literal: Self.LeafValue...)
        init(literal: (Key, Self)...)
}

> Note that all of your examples rely not just on recursion but on 
> heterogeneous recursion

The crux of the matter is not heterogeneity in general, but of the leaf value 
in particular. This is what Brent is addressing. All my examples, save one, had 
a uniform leaf value type (even the Tree<SKAction> example). The one exception 
is my second JSON example. There I did not post the lift operator overload as 
you can probably imagine it. Minimally:

enum JSONValue {
        case Text(String)
        case Integer(Int)
}

prefix func ◊ <Key> (leaf: String) -> DictionaryTree<Key, JSONValue> {
        return .Leaf(.Text(leaf))
}

prefix func ◊ <Key> (leaf: Int) -> DictionaryTree<Key, JSONValue> {
        return .Leaf(.Integer(leaf))
}


let johnny: DictionaryTree<String, JSONValue> =
[
        "name": ◊"Johnny Appleseed",
        "age": ◊25,
        "address": [
                "house_number": ◊21,
                "street": ◊"2nd Street",
                "city": ◊"New York"
        ]
]

Notice in particular how much contextual information you are getting from the 
expected return type. Still though, as Brent, points out, this won’t work with 
the two literal-convertable protocols. Nevertheless, I’d be very happy if they 
could be added as a first step since I suspect that would be the easiest option 
and one that would still allow for all my examples so far to work without the 
lift operator; all except this `JSONValue` example.

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

Reply via email to