Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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 TOut
herhangi 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
, B
A
alt türü olduğunu gösterir. Farklı şekilde ifade edilirse, B
A
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 A
tü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 A
türünde bir bağımsız değişkeni işlerse, B
tü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 B
tü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 A
tü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 T1
anlamı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 T2
sonucuna 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 TItem
tü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; B
A
alt 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.