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 TOut
iç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ü A
olduğ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 A
olması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ü A
olduğ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 A
bir bağımsız değişkeni işlerse, türündeki B
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 türünde bir bağımsız değişkeni işleyebilmesi gerekiyorsa, türün B
daha 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 A
bir 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ü T1
iç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ü T2
iç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 TItem
bir 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ü A
değ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.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin