Different result type using Parameter Packs in a result builder

It does work as expected if an intermediary type is introduced:

@resultBuilder
struct TupleBuilder {
    
    struct Pack<each T> {
        
        let tuple: (repeat each T)
        
    }
    
    static func buildPartialBlock<V>(first: V) -> Pack<V> {
        .init(tuple: first)
    }

    static func buildPartialBlock<each T, E>(accumulated: Pack<repeat each T>, next: E) -> Pack<repeat each T, String, E> {
        Pack(tuple: (repeat each accumulated.tuple, "DIVIDER", next))
    }
}

func buildTuple<T>(@TupleBuilder _ builder: () -> T) -> T {
    builder()
}

let builtTuple = buildTuple {
    1
    "two"
    3.3
}
print(builtTuple.tuple)           // (1, "DIVIDER", "two", "DIVIDER", 3.3)
print(type(of: builtTuple.tuple)) // (Int, String, String, String, Double)
1 Like