Aracılığıyla paylaş


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. Bu 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, TIn ve TOutherhangi iki somut tür için alt stil ilişkisi

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

burada A :> B, BAalt türü olduğunu gösterir. Farklı şekilde ifade edilirse, BA daha kısıtlayıcıdır, böylece B türünde bir değer A türünde bir değer gerektiğinde kullanılabilir. Çağrılabilen bir bağımsız değişken Atüründe bir bağımsız değişkene (öğe) dayanırsa, gerekli tüm özellikleri sağladığından B türünde bir bağımsız değişken güvenle değiştirilebilir.

Bu tür bir polimorfizm, B türündeki bir tanımlama grubu, aynı sayıda öğe içeriyorsa ve her öğenin türü A'de ilgili öğe türünün alt türüyse A bir tanımlama grubu türünün alt türü olduğu tanımlama gruplarına genişletilir. Bu, derinlik alt stili olarak bilinir. şu anda genişlik alt stili desteği yoktur, yani iki struct türü veya struct türü ile yerleşik tür arasında alt tür ilişkisi yoktur. Tüm adlandırılmış öğeleri içeren bir tanımlama grubu ayıklamanıza olanak tanıyan unwrap işlecinin varlığı bunu önler.

Uyarı

Çağrılabilir öğelerle ilgili olarak, çağrılabilen bir bağımsız değişken Atüründe bir bağımsız değişkeni işlerse, Btüründe bir 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 Btüründe bir bağımsız değişkeni işleyebilmesi gerekiyorsa, A türünde daha genel bir bağımsız değişkeni işleyebilen çağrılabilen herhangi bir değişkenin güvenli bir şekilde geçirilebileceği anlamına gelir. Buna karşılık, geçirilen çağırılabilir öğesinin Atüründe bir değer döndürmesini gerektirirsek, B türünde bir değer döndürme sözü yeterlidir, çünkü bu değer tüm gerekli özellikleri sağlar.

İşlem veya işlev türü bağımsız değişken türünde değişken ve dönüş türünde kovaryan. A :> B bu nedenle herhangi bir beton türü için T1anlamına gelir.

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

burada bir işlev veya işlem anlamına gelebilir ve özellikler için ek açıklamaları atlarız. sırasıyla (B → T2) ve (T2 → A) ile A ve sırasıyla (A → T2) ve (T2 → B) ile B değiştirmek, herhangi bir somut tür için T2sonucuna yol açar.

    ((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 dolaylının bağımsız değişken türünün varyansını tersine çevirdiğini ve dönüş türünün varyansını değişmeden bıraktığını izler.

Uyarı

Bu, dizilerin varyans davranışının ne olması gerektiğini de netleştirir; öğe erişim işleci aracılığıyla öğeleri almak, (Int -> TItem)türünde bir işlevi çağırmaya karşılık gelir; burada TItem dizideki öğelerin türüdür. 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 olan ve dolayısıyla her öğe türüne göre birlikte değişken olan tanımlama grupları için de geçerlidir. Diziler sabit olmasaydı, dizideki öğeleri ayarlamanıza ve bu nedenle TItemtüründe bir bağımsız değişken almanıza olanak sağlayan bir yapının varlığı, dizilerin de değişkensiz 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; BAalt türü olsa bile B[]A[] alt türü . Q# dizilerinin sabit olmasına rağmen, kovaryant yerine sabittir. Bu, örneğin, (Qubit => Unit is Adj)[] türünde bir değerin (Qubit => Unit)[]türünde bir bağımsız değişken gerektiren çağrılabilir bir değere geçirilemeyeceği anlamına gelir. Dizileri sabit tutmak, 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.