Bir tip sistemin güvenlik faydaları nelerdir?


47

In JavaScript: The Good Parts Douglas Crockford tarafından, onun miras bölümde bahseder

Klasik kalıtımın bir diğer faydası ise, bir tür sistemin özelliklerini içermesidir. Bu, çoğunlukla programcının açık döküm işlemleri yazmak zorunda kalmamasını sağlar, bu da çok iyi bir şeydir çünkü döküm yaparken, bir tip sistemin güvenlik yararları kaybolur.

Her şeyden önce, aslında güvenlik nedir? veri bozulmalarına, bilgisayar korsanlarına veya sistem arızalarına karşı koruma, vb.

Bir tip sistemin güvenlik faydaları nelerdir? Bu güvenlik avantajlarını sağlamasına izin veren bir tip sistemini farklı yapan nedir?


Yazım sistemlerinin derlenmemiş bir dil için herhangi bir yarar sağladığından emin değilim, fakat uzun süreli bir derlenmiş dil kullanıcısı olarak, dikkatli yazım denetimi olan derlenmiş dillerin birçok belirsiz, tanımsız veya eksik kod türünün engellenmesinde etkili olduğunu düşünüyorum. "derleme" aşamasını geçmek. Sanırım tür ipuçlarını ve bir Lint sisteminin Web Komut Dosyası (JavaScript) için değerli olduğunu söyleyebiliriz ve öyleyse, bunları yeterince göreceğimize eminim. Birini dartmak mı? Python gibi dinamik diller, statik tip bir sistem olmadığı için daha kötü görünmemektedir.
Warren P,

1
Bugün yazmanın davranışsal ve yapısal değil olması gerektiğini anlıyoruz . Ne yazık ki, çoğu modern programlama dilinin bir türün davranışını gösterme yolu yoktur ( hoş bir okuma için bu soruya bakın ). Bu, özellikle çoğu durumda tip sistemini oldukça işe yaramaz kılar, çünkü burada bahsedilen cevapların basit tip hataları, genel sorunları kontrol eden akıllı bir linter tarafından yakalanabilir.
Benjamin Gruenbaum

4
@BenjaminGruenbaum Tanımlamanız zaten OCaml gibi dillerde statik olarak var. Buna yapısal yazma denir, aslında oldukça eski, nominal yazma daha yenidir.
jozefg

2
@BenjaminGruenbaum: ... Ne !? Açıkçası , statik olarak yazılmış dillerde karar verilemez veya bu diller için bir derleyici yazmak imkansız olurdu.
BlueRaja - Danny Pflughoeft 25:13

6
@BenjaminGruenbaum: Yorumlarınız değerlidir ve bu makale ilginçtir, ancak C # ' da kararsız olduğunu ve soruyu açık bıraktığı için "genellikle Java gibi statik dillerde de kararsız olduğunu" iddia edemezsiniz. Java'da kararsız olup olmadığını. (Her neyse, IME, statik olarak yazılmış bir dil için bir derleyici bir şeyin iyi yazılmış olduğuna karar veremediğinde, onu reddeder (veya derleyemez), bu yüzden kararsızlık, türdeki bir delikten ziyade bir sıkıntıdır; güvenlik.)
ruakh

Yanıtlar:


82

Tip sistemleri hataları önler

Tip sistemleri yasadışı programları ortadan kaldırır. Aşağıdaki Python kodunu göz önünde bulundurun.

 a = 'foo'
 b = True
 c = a / b

Python'da bu program başarısız olur; bir istisna atar. Java, C #, Haskell gibi bir dilde , her neyse, bu yasal bir program bile değil. Bu hatalardan tamamen kaçınırsınız çünkü giriş programlarında bu mümkün değildir.

Benzer şekilde, daha iyi bir tip sistem daha fazla hataya neden olmaz. Süper gelişmiş tip sistemlere geçersek, şöyle şeyler söyleyebiliriz:

 Definition divide x (y : {x : integer | x /= 0}) = x / y

Şimdi tip sistemi, 0'a bölünme hatası olmadığını garanti eder.

Ne tür hatalar

Aşağıda, hata sistemlerinin nasıl önleyebileceğinin kısa bir listesi verilmiştir.

  1. Aralık dışı hatalar
  2. SQL enjeksiyonu
  3. 2 genelleme, birçok güvenlik sorunları (Ne kokuşma denetimi içinde içindir Perl )
  4. Sıra dışı hatalar (init aramayı unutmak)
  5. Kullanılacak değer alt kümesini zorlamak (örneğin, yalnızca 0'dan büyük tam sayılar)
  6. Nefretli kedi yavruları (Evet, şakaydı)
  7. Kesinlik kaybı
  8. Yazılım işlem belleği (STM) hataları (bu, türler de gerektiren saflık gerektirir)
  9. 8 genelleştirilmesi, yan etkilerin kontrol edilmesi
  10. Veri yapıları üzerindeki değişmezler (ikili bir ağaç dengelidir?)
  11. Bir istisna unutmak veya yanlış atmak

Ve unutmayın, bu aynı zamanda derleme zamanındadır. Sadece tip hatalarını kontrol etmek için% 100 kod kapsamı ile testler yazmaya gerek yok, derleyici sadece sizin için yapar :)

Örnek olay: Typed lambda matematiği

Pekala, en basitçe yazılmış lambda matematiği olan tüm tip sistemleri inceleyelim .

Temel olarak iki tip var.

Type = Unit | Type -> Type

Ve tüm terimler değişkenler, lambdalar veya uygulamalardır. Buna dayanarak, iyi yazılmış herhangi bir programın sona erdiğini kanıtlayabiliriz. Programın sıkışıp kalacağı veya sonsuza dek döngüleneceği bir durum asla yoktur. Bu normal lambda hesaplarında kanıtlanamaz çünkü doğru değil.

Bunu düşünün, programımızın sonsuza dek döngüde olmadığından emin olmak için tip sistemlerini kullanabiliriz, değil mi?

Dinamik tiplere sapma

Dinamik tip sistemler statik tip sistemler ile aynı garantileri sunabilir, fakat derleme zamanı yerine çalışma zamanında. Aslında, çalışma zamanı olduğundan, aslında daha fazla bilgi sunabilirsiniz. Bununla birlikte, özellikle de fesih gibi statik özelliklerle ilgili bazı garantileri kaybedersiniz.

Bu nedenle, dinamik türler belirli programları dışlamaz, ancak hatalı biçimlendirilmiş programları istisnalar atma gibi iyi tanımlanmış eylemlere yönlendirir.

TLDR

Bu yüzden uzun ve kısa olanı, bu tip sistemler belirli programları dışlamaktır. Programların çoğu bir şekilde bozulmuştur, bu nedenle, tip sistemleri ile bu bozuk programlardan kaçınırız.


25
Çok sayıda test yazmaya eşdeğer olarak +1.
Dan Neely

3
@DanNeely Dinamik bir dilde, bir tür sistemin ücretsiz kontrol ettiği hataları yakalamak için kodun tüm kısımlarını kullanmanız gerektiğini göstermek sadece. Ve bağımlı bir şekilde yazılmış bir dilde, aslında testleri tamamen türlerle değiştirebilirsiniz. Çoğu zaman yine de ek doğruluk teoremlerini kanıtlamanız gerekir
jozefg

3
Eğer tip sisteminiz programınızın sonlandırılması gerektiğini ispatladıysa (muhtemelen) bunu ilkel-özyinelemeli bir fonksiyon hesapladığını kanıtlayarak yapılır. Hangi havalı olduğunu varsayalım, ama gerçek bir Turing Makinesinin çözebileceğinden çok daha az ilginç bir karmaşıklık sınıfı. (Bu, ara değerlerin büyük olmadığı anlamına gelmez; Ackermann işlevi ilkel-özyinelemelidir…)
Donal Fellows

5
@ DonalFellows Toplam hesaplanabilir bir fonksiyon olmasına rağmen Ackermann işlevi ilkel özyinelemeli değildir.
Taymon,

4
@sacundim Tam olarak, agda gibi diller isteğe bağlı bütünlük denetimine izin verir ve nadiren keyfi bir şekilde tekrarlamak istediğiniz durumlarda hoş bir şekilde sorabilirsiniz, oldukça kaygan bir sistemdir.
jozefg

17

Gerçekliğin kendisi yazılmıştır. Ağırlıklara uzunluk ekleyemezsiniz. Sayaçlara ayak ekleyebilirsiniz (her ikisi de uzunluk birimidir), ikisinden en az birini ölçeklendirmelisiniz. Bunu yapmamak, tam anlamıyla Mars görevinizi çökertebilir.

Bir yazı tipi sisteminde, farklı birimlerde ifade edilen iki uzunluk eklenmesi ya bir hata olmuş ya da otomatik alçıya neden olmuş olabilir.


15

Bir yazım sistemi basit kodlama hatalarından kaçınmanıza yardım eder veya derleyicinin sizin için bu hataları yakalamasına izin verir.

Örneğin, JavaScript ve Python'da, aşağıdaki sorun genellikle yalnızca çalışma zamanında yakalanır - ve koşulun test kalitesine / nadirliğine bağlı olarak gerçekten üretime yol açabilir:

if (someRareCondition)
     a = 1
else
     a = {1, 2, 3}

// 10 lines below
k = a.length

Güçlü bir şekilde yazılmış bir dil sizi açıkça abir dizi olduğunu belirtmeye zorlayacaktır ve bir tamsayı atamanıza izin vermeyecektir. Bu şekilde, nadir durumlarda bile olmayacak hiçbir şans ayoktur length.


5
Ve WebStorm JavaScript gibi bir IDE'deki akıllıca bir linter "" a. Bu bize açık bir tür sisteme sahip olarak verilmemiştir.
Benjamin Gruenbaum

4
1. Statik olarak güçlü değil 2.BenjaminGruenbaum Evet, ama bu arka planda bir atama grafiğini takip ederek yapılır, işlerin nereye gittiğini anlamaya çalışan mini bir tercüman gibi düşünün. Türleri bedavaya verdiğinden çok daha zor
jozefg

6
@BenjaminGruenbaum: Örtük / açık olanı güçlü / zayıf ile karıştırmayın. Örneğin Haskell, diğer dillerin çoğunu utandırmak için inanılmaz derecede güçlü bir tür sisteme sahiptir, ancak bazı dil tasarım kararları nedeniyle, neredeyse tamamen evrensel bir tür çıkarımı yapabilme kabiliyetine sahipti; (Eğer kullanmalıdır Yani, tip inferencer sadece, yazdıklarını çıkarsayabileceklerini çünkü değil ne anlama geldiğini!)
Phoshi

6
“Kuvvetle yazılmış bir dil, sizi açıkça bir dizi olduğunu belirtmeye zorlar” Bu yanlış. Python kesinlikle yazılmıştır ve bunu gerektirmez. Statik olarak ve kuvvetle yazılan diller bile, tür çıkarımını destekliyorlarsa (ve bugünlerde çoğu ana dilde, en azından kısmen bunu yapar) istemez.
Konrad Rudolph

1
@ BenjaminGruenbaum: Ah, yeterince adil. Öyle olsa bile, hiçbir JS statik analizörünün güçlü bir şekilde yazılmış bir dilin sağlayamayacağı aynı tipte kontrolleri yapamayan durumlar olacak, genel durumda durdurma probleminin çözülmesi gerektiğini çözecek. Haskell,% 100'e yakın tipte çıkarım elde etmek için adil birkaç tasarım kararı vermek zorunda kaldı ve C # / Scala her şeyi çıkarsamayacaktır. Tabii ki, bu gibi durumlarda, sadece türlerini açıkça belirleyebildiğiniz için farketmez - Javascript'te, en iyi statik analizörün bile kodunuzu kontrol edemeyeceği anlamına gelir.
Phoshi

5

Yazılım geliştirme döngüsünde ne kadar erken bir hata yakalarsanız, düzeltmesi o kadar ucuz olur. En büyük müşterinizin veya tüm müşterilerinizin veri kaybetmesine neden olan bir hata düşünün. Böyle bir hata, yalnızca gerçek müşteriler veri kaybettikten sonra yakalanırsa şirketinizin sonu olabilir! Üretime geçmeden önce bu hatayı bulmak ve düzeltmek açıkça daha ucuz .

Daha az maliyetli hatalar için bile, eğer test yapanlar programcıların bulabildiği ve tamir edebileceğinden daha fazla zaman harcarlar. Diğer programcıların kendine güvenen bir yazılım geliştirebilecekleri kaynak kontrolüne alınmazsa daha ucuz olur. Tip güvenliği, belirli hata sınıflarının bile derlenmesini önler, böylece bu hataların neredeyse tüm maliyetini ortadan kaldırır.

Ama bu bütün hikaye değil. Dinamik bir dilde program yapan herkesin size söyleyeceği gibi, programınız derlerse bir kısmı güzel olur, böylece çalışmak için her küçük ayrıntıyı almadan bir kısmını deneyebilirsiniz. Güvenlik ve kolaylık arasında bir denge var. Birim testleri, dinamik bir dil kullanma riskinin bir kısmını azaltabilir, ancak iyi birim testleri yazmanın ve sürdürmenin, güvenli bir dil kullanmanınkinden daha yüksek olabileceği kendi maliyeti vardır.

Deneme yapıyorsanız, kodunuz yalnızca bir kez kullanılacaksa (bir kerelik rapor gibi), yine de bir birim sınavı yazmaya zahmet etmeyeceğiniz bir durumdaysanız, muhtemelen mükemmel bir dil senin için. Büyük bir uygulamanız varsa ve bir parçasını diğer parçalarını kesmeden değiştirmek istiyorsanız, güvenlik yazın bir hayat kurtarıcıdır. Hata tipi güvenlikle ilgili yakalama türleri, yeniden yapılanma sırasında insanların göz ardı etme ya da yanlış anlama eğilimi gösterdikleri hatalardır.


Bu, dinamik yazmayı kısa satar, temel faydalarından bahsetmekte başarısız olur (belirtilenler nispeten önemsizdir). Ayrıca, birim testleriyle ilgili garip bir şey ima ediyor gibi gözüküyor - evet, yapılması zor ve maliyeti var ve bu statik olarak yazılmış diller için de geçerli. Bu ne demeye çalışıyor? Aynı zamanda, mevcut tip sistemlerin sınırlarını (tasarım yoluyla), ne ifade edebildiklerini ve ne hataları yakalayabildiklerini belirtmekte başarısız olur.

@MattFenwick dinamik yazmanın temel faydaları nelerdir?
GlenPeterson

Tipik statik tip sistemler, iyi yazılmış birçok programı tasarıma göre reddeder. ( bir alternatif ) (BTW, eleştirim yalnızca 3. ve 4. paragraflara

4

Giriş

Tip güvenliği, statik olarak yazılmış (derlenmiş, statik tip kontrolü) ve / veya çalışma zamanı (değerlendirilmiş, dinamik tip kontrolü) dilleriyle sağlanabilir. Wikipedia'ya göre '... güçlü bir sistem , denetlenmeyen bir çalışma zamanı türü hatası (ed Luca Cardelli) bulunma ihtimalinin olmadığı bir sistem olarak tanımlanmaktadır. Diğer bir yazıda, kontrolsüz çalışma zamanı hatalarının olmaması emniyet veya tip güvenliği olarak adlandırılır ... '

Güvenlik - Statik Tip Kontrolü

Klasik olarak, tür güvenliği, derlendiklerinde yazılan eşleşmeleri algılamak için tasarlanan C, C ++ ve Haskell gibi dillerde statik yazımla eşanlamlıdır. Bu, program yürütülürken potansiyel olarak tanımlanmamış veya hataya açık koşullardan kaçınma avantajına sahiptir. Bu, işaretçi türlerinin yanlış eşleşmesi riski, örneğin, tespit edilmezse yıkıcı sonuçlara yol açabilecek bir durum söz konusu olduğunda, paha biçilmez olabilir. Bu anlamda statik yazma, bellek güvenliğiyle eş anlamlı olarak kabul edilir.

Ancak, statik yazım tamamen güvenli değildir ancak güvenliği artırır . Statik olarak yazılmış sistemler bile feci sonuçlara yol açabilir. Birçok uzman, statik olarak yazılmış olanların daha sağlam ve daha az hata eğilimli (kritik görev) sistemleri yazmak için kullanılabileceğini düşünmektedir.

Statik olarak yazılan diller , sayısal işlerde veri eşleştirmesi veya doğruluk kaybı riskini azaltmaya yardımcı olabilir ; bu, çift eşlemeli veya eşleşmeli integral ve değişken türlerinin yanlış eşleşmesi veya kesilmesi nedeniyle oluşabilir.

Statik olarak yazılmış dillerin kullanım verimliliği ve yürütme hızı için kullanılmasının bir avantajı vardır. Çalışma zamanı, yürütme sırasında türleri belirlemek zorunda olmamaktan yararlanır.

Güvenlik - Çalışma Zamanı Tipi Kontrolü

Erlang, örneğin, sanal bir makinede çalışan bir tür bildirici, dinamik olarak yazılan kontrol dilidir. Erlang kodu byte derlenebilir. Erlang, belki de görev açısından kritik olan en önemli, hataya dayanıklı dil olarak kabul edilen bir dil olarak kabul edilir ve Erlang'ın dokuz 9'luk bir güvenilirliği olduğu bildirilir (yılda% 99.9999999 veya% 31,5 milisaniyeden fazla değil).

Common Lisp gibi bazı diller statik olarak yazılmaz, ancak istenirse hız ve verimi artırmaya yardımcı olabilecek türler bildirilebilir. Python gibi daha yaygın olarak kullanılan yorumlanmış dillerin çoğunun, değerlendirme döngüsünün altında, C veya C ++ gibi statik olarak yazılmış dillerde yazılmış olduğu da belirtilmelidir. Hem Commom Lisp hem de Python, yukarıdaki tanım gereği güvenli olarak kabul edilir.


2
"Kesinlikle yazılmış" itiraz ediyorum. Statik olarak yazılmış demek istiyorsun. Kesinlikle güçlü bir anlam ifade etmiyor, temelde "Bu tip sistemi sevdim" demek için kullanılır
jozefg

@ jozefg İyi nokta. Gönderiyi değiştireceğim.
AsymLabs

3
Ayrıca, bir dil uygulaması hakkında yorumlanmış bir dil söylemek de faydalı değildir, evet, fakat dilin kendisi değil. Herhangi bir dil yorumlanabilir veya derlenebilir. Düzenlemeden sonra bile güçlü ve zayıf yazım terimlerini kullanıyorsunuz.
Esailija

3
@jozefg: Her zaman güçlü bir şekilde yazılmasının, her bir değerin sabit bir tipe (örn. tamsayı, dize, vb.) sahip olduğu anlamına geldiğini düşünürdüm, zayıf yazılmış ise, bir değerin uygun olması düşünüldüğünde başka bir türün değerine zorlanabileceği anlamına gelir. yani. Örneğin, Python'da (kesinlikle yazılmış), 1 + "1"bir istisna atar, oysa PHP'de (zayıf yazılmış) 1 + "1"üretir 2(dize "1"otomatik olarak tamsayıya dönüştürülür 1).
Giorgio

1
@Giorgio, örneğin Java gibi bir tanımla, kesinlikle yazılmaz. Ancak birçok durumda olduğu iddia ediliyor. Bu kelimelerin hiçbir anlamı yoktur. Yazılan Güçlü / Zayıf, jozefg'in dediği gibi "Bu dili seviyorum / sevmiyorum" olarak tanımlamasının çok daha doğru bir tanımı var.
Esailija

1

Bir tip sistemin güvenlik faydaları kaybolur.

Her şeyden önce, aslında güvenlik nedir? veri bozulmalarına, bilgisayar korsanlarına veya sistem arızalarına karşı koruma, vb.

Bir tip sistemin güvenlik faydaları nelerdir? Bu güvenlik avantajlarını sağlamasına izin veren bir tip sistemini farklı yapan nedir?

Tip sistemlerinin olumsuz bir görüşü olduğunu hissediyorum. Bir tip sistem, hata bulunmadığını kanıtlamaktan daha fazla garanti vermekle ilgilidir. İkincisi, tip sisteminin bir sonucudur. Bir programlama dili için bir tip sistemi, derleme zamanında bir programın bir tür belirtime uyduğunun bir kanıtını üretmenin bir yoludur.

Birinin bir tür olarak kodlayabileceği özellik türü, dilin türüne veya doğrudan dilin tür sisteminin gücüne bağlıdır.

En temel özellik türü, işlevlerin girdi / çıktı davranışı ve işlev gövdesinin içinin geçerliliği hakkında bir garantidir. Bir fonksiyon başlığı düşünün

f : (Int,Int) -> String

İyi bir tür sistem, f'nin yalnızca değerlendirme sırasında bir çift Int üretecek nesnelere uygulanmasını sağlar ve f'nin her zaman bir dize üreteceğini garanti eder.

If-then blokları gibi bir dilde bazı ifadelerin girdi / çıktı davranışı yoktur; burada tür sistemi bloktaki her bildirimin veya bildirimin geçerli olduğunu garanti eder; Bu, işlemleri doğru türdeki nesnelere uygular. Bu garantiler birleştirilebilir.

Ayrıca, bu bir çeşit hafıza güvenliği durumu sağlar. Sizinle uğraştığınız alıntı döküm hakkında. Bazı durumlarda, 64-bit Int'e 32-bit Int vermek gibi, döküm iyidir. Ancak, genel olarak, tip sistemini çökertir.

Düşünmek

Foo x = new Foo(3,4,5,6);
f((Int)x,(Int)x);

Döküm nedeniyle, x, bir int'ye dönüştürülür, bu nedenle teknik olarak yukarıdaki tip kontrol yapılır; bununla birlikte, tipik olarak denetlemenin amacını yendi.

Farklı ve daha iyi tipte bir sistem yaratabilecek şeylerden biri, B'nin A'nın bir alt türü (veya alt nesnesinin) olmadığı durumlarda, A'nın x'in davadan önce x'in B tipi olduğu durumunun hükümsüz hale getirilmesidir. Tamsayı taşma / taşma ataklarının olasılığını ortadan kaldırmak için.

özet

Bir tür sistemi, bir programın bir tür belirtime uyduğunu kanıtlamanın bir yoludur. Bir tip sistemin sağlayabileceği faydalar, kullanılan tip sisteminin gücüne bağlıdır.


1

Bir tip sistem için henüz belirtilmeyen bir avantaj, birçok programın yazıldığından daha fazla okunması gerçeğine odaklanır ve çoğu durumda bir tür sistem, çok sayıda bilginin özlü ve kolay bir şekilde belirtilmesine izin verebilir Kodu okuyan biri tarafından sindirilir. Parametre türleri tanımlayıcı yorumların yerini almazken, çoğu kişi okumayı daha hızlı bulacaktır: "int Distance;" veyaDistance As Int32"Mesafe tam sayı +/- 2147483647 olmalı"; geçen fraksiyonlar tutarsız sonuçlar doğurabilir. "Ayrıca, parametre türleri, arayanların güvenebileceği bir API uygulamasının ne yapması gerektiği arasındaki farkı azaltmaya yardımcı olabilir. Örneğin, bir API'nin belirli bir Javascript uygulaması kullanıyorsa sayısal olarak herhangi bir dize zorlamak tanıyan bir şekilde parametreleri, API kudreti arıza diğer uygulamalar dizeleri verilen eğer arayanlar tür bir davranış dayanmak izin veya ister açık olabilir. parametresi olarak belirtilen bir yöntem sahip Doublemisiniz? öğesinin dize değerlerinin arayan tarafından geçilmeden önce zorlanması gerektiğini, kabul eden bir aşırı yükleme yöntemine ve kabul eden Doublebaşka bir yönteme sahip olduğunu açıkça belirtin.String telleri tutan arayanların bu şekilde geçmelerine izin verileceğini biraz daha net bir şekilde ortaya koyardı.


0

Her şeyden önce, aslında güvenlik nedir? Veri bozulmalarına, bilgisayar korsanlarına veya sistem arızalarına vb. Karşı koruma?

Diğer cevapların tümü ve daha fazlası. Genel olarak, "tür güvenliği", derleyicinin başarılı bir şekilde derlediği programlardan hiçbirinin tür hataları içermeyeceği anlamına gelir.

Şimdi, bir tür hatası nedir? Prensip olarak, herhangi bir istenmeyen özelliği bir tip hatası olarak belirleyebilirsiniz ve bazı tip sistemleri statik olarak hiçbir programın böyle bir hata yapmadığından emin olabilir.

Yukarıdaki "özellik" derken, programınız için geçerli olan bir tür mantıksal teklif, örneğin, "tüm dizinler dizi sınırları içindedir" anlamına gelir. Diğer özellik türleri arasında "tüm ertelenmiş işaretçiler geçerlidir", "bu program herhangi bir G / Ç gerçekleştirmez" veya "bu program yalnızca / dev / null için G / Ç gerçekleştirir", vb. özellik, tür sisteminizin açıklığına bağlı olarak bu şekilde belirtilebilir ve yazılabilir.

Bağımlı tip sistemler, istediğiniz herhangi bir özelliği uygulayabileceğiniz en genel tip sistemler arasındadır. Bunu yapmak kesinlikle kolay değil çünkü sofistike mülkler Gödel'in eksikliğine bağlı .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.