Share via


Alt tür oluşturma ve varyans

Q# yalnızca birkaç dönüştürme mekanizmasını destekler. Örtük dönüştürmeler yalnızca ikili işleçler uygulanırken, koşullu ifadeler değerlendirilirken veya dizi değişmez değeri oluşturulurken gerçekleşebilir. Böyle durumlarda, ortak bir üst tür belirlenir ve gerekli dönüştürmeler otomatik olarak gerçekleştirilir. Bu tür örtük dönüştürmelerin yanı sıra, işlev çağrıları aracılığıyla açık dönüştürmeler mümkündür ve genellikle gereklidir.

Şu anda, var olan tek alt stil ilişkisi işlemler için geçerlidir. Sezgisel olarak, gerekli functor kümesinden daha fazlasını destekleyen bir işlemi değiştirmesine izin verilmesi mantıklıdır. Somut olarak, herhangi iki beton türü TIn ve TOutiçin alt stil ilişkisi

    (TIn => TOut) :>
    (TIn => TOut is Adj), (TIn => TOut is Ctl) :>
    (TIn => TOut is Adj + Ctl)

whereA :> B, bunun bir alt türü Aolduğunu B gösterir. Farklı şekilde ifade edilir, B türün B değerinin gerekli olduğu her yerde A kullanılabilmesinden daha A kısıtlayıcıdır. Çağrılabilen bir bağımsız değişkenin (öğe) türünde Aolmasına bağlıysa, gerekli tüm özellikleri sağladığından türün B bağımsız değişkeni güvenle değiştirilebilir.

Bu tür bir polimorfizm, aynı sayıda öğe içeriyorsa ve her öğenin türü içinde B karşılık gelen öğe türünün bir alt türüyse, bu tür bir tanımlama grubu bir tanımlama grubu türünün A alt türü Aolduğu için demetlere genişletilir. Bu, derinlik alt stili olarak bilinir. Şu anda genişlik alt stili desteği yoktur; başka bir ifadeyle, kullanıcı tanımlı iki tür veya kullanıcı tanımlı tür ile yerleşik tür arasında alt tür ilişkisi yoktur. Tüm adlandırılmış ve anonim öğeleri içeren bir tanımlama grubu ayıklamanıza olanak tanıyan işlecin varlığı unwrap bunu önler.

Not

Çağrılabilenler açısından, çağrılabilen bir bağımsız değişken türündeki Abir bağımsız değişkeni işlerse, türündeki Bbir bağımsız değişkeni de işleyebilecektir. Çağrılabilir başka bir çağrılabilir bağımsız değişken olarak geçirilirse, tür imzasının gerektirebileceği her şeyi işleyebilmeli. Bu, çağrılabilen öğesinin türünde bir bağımsız değişkeni işleyebilmesi gerekiyorsa, türün Bdaha genel bir bağımsız değişkenini işleyebilen çağrılabilen herhangi bir değişkenin A güvenli bir şekilde geçirilebileceği anlamına gelir. Buna karşılık, geçirilen çağrılabilen öğesinin türünde Abir değer döndürmesini gerektirirsek, bu değer gerekli tüm özellikleri sağlayacağından tür B değeri döndürme taahhülünün yeterli olmasını bekliyoruz.

İşlem veya işlev türü bağımsız değişken türünde değişkendir ve dönüş türünde birlikte değişkendir . A :> B bu nedenle herhangi bir beton türü T1için ima eder,

    (B → T1) :> (A → T1), and
    (T1 → A) :> (T1 → B) 

burada bir işlev veya işlem anlamına gelebilir ve özelliklerin ek açıklamalarını atlarız. A sırasıyla ve (T2 → A) ile (B → T2) değiştirme ve sırasıyla ve (T2 → B) ile (A → T2) değiştirmeB, herhangi bir beton türü T2için ,

    ((A → T2) → T1) :> ((B → T2) → T1), and
    ((T2 → B) → T1) :> ((T2 → A) → T1), and
    (T1 → (B → T2)) :> (T1 → (A → T2)), and
    (T1 → (T2 → A)) :> (T1 → (T2 → B)) 

Endüksiyona göre, her ek dizin bağımsız değişken türünün varyansını tersine çevirir ve dönüş türünün varyansını değişmeden bırakır.

Not

Bu, dizilerin varyans davranışının ne olması gerektiğini de netleştirir; öğe erişim işleci aracılığıyla öğeleri almak, dizideki öğelerin türü olan TItem türünde (Int -> TItem)bir işlevi çağırmaya karşılık gelir. Bu işlev bir dizi geçirilirken örtük olarak geçirildiğinden, dizilerin öğe türlerinde birlikte değişken olması gerektiğini izler. Aynı hususlar, sabit ve dolayısıyla her öğe türüne göre birlikte değişken olan tanımlama demetleri için de geçerlidir. Diziler sabit değilse, bir dizideki öğeleri ayarlamanıza ve bu nedenle türünde TItembir bağımsız değişken almanıza olanak sağlayan bir yapının varlığı, dizilerin de değişken karşıtı olması gerektiği anlamına gelir. Öğeleri almayı ve ayarlamayı destekleyen veri türleri için tek seçenek sabit olmasıdır; başka bir deyişle alt stil ilişkisi yoktur; B[] alt türü A[] olsa B bile alt türü Adeğildir. içindeki Q# dizilerin sabit olmasına rağmen, bunlar birlikte sabit değil sabittir. Bu, örneğin türünde bir değerin türünde (Qubit => Unit is Adj)[] bağımsız değişken (Qubit => Unit)[]gerektiren çağrılabilir bir değere geçirilemeyeceği anlamına gelir. Dizilerin sabit tutulması, dizilerin çalışma zamanında nasıl işlenip iyileştirileceğiyle ilgili daha fazla esneklik sağlar, ancak gelecekte bunu gözden geçirebilmek mümkün olabilir.