Kesishish turi - Intersection type

Yilda tip nazariyasi, an kesishish turi ikkala turga ham berilishi mumkin bo'lgan qiymatlarga ajratilishi mumkin va turi . Ushbu qiymatga kesishish turi berilishi mumkin ichida kesishish turi tizimi.[1]Odatda, agar ikkita turdagi qiymatlar diapazoni bir-biriga to'g'ri keladigan bo'lsa, u holda kesishish ikkita diapazonga tayinlanishi mumkin kesishish turi Ushbu ikki turdagi. Bunday qiymat ishonchli tarzda kutilayotgan funktsiyalarga dalil sifatida berilishi mumkin yoki Ikki turdagi .Masalan, yilda Java sinf Mantiqiy ikkalasini ham amalga oshiradi Serializatsiyalanadigan va Taqqoslash mumkin interfeyslar. Shuning uchun, turdagi ob'ekt Mantiqiy turi argumentini kutayotgan funktsiyalarga xavfsiz tarzda o'tish mumkin Serializatsiyalanadigan va turdagi argumentni kutadigan funktsiyalarga Taqqoslash mumkin.

Kesishma turlari kompozit ma'lumotlar turlari. O'xshash mahsulot turlari, ular ob'ektga bir nechta turlarni belgilash uchun ishlatiladi, ammo mahsulot turlari belgilanadi koreyslar, shuning uchun har bir tuple elementiga ma'lum bir mahsulot turi komponenti beriladi. Taqqoslash uchun, kesishish turlarining asosiy ob'ektlari birlashtirilishi shart emas. Kesishish turlarining cheklangan shakli takomillashtirish turlari.

Kesishish turlari tavsiflash uchun foydalidir ortiqcha yuklangan funktsiyalar.[2] Masalan, agar raqam => raqam sonni argument sifatida qabul qiladigan va sonni qaytaradigan funktsiya turi va mag'lubiyat => mag'lubiyat bu argument sifatida mag'lubiyatni qabul qiladigan va mag'lubiyatni qaytaradigan funktsiya turi bo'lib, u holda bu ikki tipning kesishishi yordamida u yoki bu ishni bajaradigan funktsiyalarni tavsiflash uchun (ortiqcha yuklangan) kirishning qaysi turiga asoslanib foydalanish mumkin.

Zamonaviy dasturlash tillari, shu jumladan Seylon, Oqim, Java, Scala, TypeScript va Whiley (qarang tillarni kesishish turlari bilan taqqoslash ), interfeys xususiyatlarini birlashtirish va ifodalash uchun kesishish turlaridan foydalaning vaqtincha polimorfizm.Toplash parametrik polimorfizm, sinflar ierarxiyasining ifloslanishiga yo'l qo'ymaslik uchun kesishish turlaridan foydalanish mumkin o'zaro faoliyat tashvishlari va kamaytiring qozon plitasi, ko'rsatilgandek TypeScript misoli quyida.

The nazariy turni yozing kesishish turlarini o'rganish kesishish turi intizomi.[3]Shunisi e'tiborga loyiqki, dasturni tugatish kesishish turlari yordamida aniq tavsiflanishi mumkin.[4]

TypeScript misoli

TypeScript kesishish turlarini qo'llab-quvvatlaydi,[5] tip tizimining ekspresivligini oshirish va potentsial sinf ierarxiyasi hajmini kamaytirish, quyidagicha namoyish etildi.

Quyidagi dastur kodi sinflarni belgilaydi Tovuq, Sigirva RandomNumberGenerator har birining usuli bor mahsulot har qanday turdagi ob'ektni qaytarish Tuxum, Sut, yoki raqam.Bundan tashqari, funktsiyalar eatEgg va ichimlik suti turdagi argumentlarni talab qilish Tuxum va Sutnavbati bilan.

sinf Tuxum { xususiy mehribon: "Tuxum" }sinf Sut { xususiy mehribon: "Sut" }// tuxum ishlab chiqaradisinf Tovuq { mahsulot() { qaytish yangi Tuxum(); } }// sut ishlab chiqaradisinf Sigir { mahsulot() { qaytish yangi Sut(); } }// tasodifiy sonni hosil qiladisinf RandomNumberGenerator { mahsulot() { qaytish Matematika.tasodifiy(); } }// tuxum kerakfunktsiya eatEgg(tuxum: Tuxum) {    qaytish - Men tuxum yeydim.;}// sut talab qiladifunktsiya ichimlik suti(sut: Sut) {    qaytish - Men bir oz sut ichdim.;}

Quyidagi dastur kodi maxsus polimorfik funktsiya animalToFood bu a'zo funktsiyasini chaqiradi mahsulot berilgan ob'ekt hayvon.Funktsiya animalToFood bor ikkitasi izohlarni yozing, ya'ni ((_: Tovuq) => Tuxum) va ((_: Sigir) => Sut), kesishgan turdagi konstruktor orqali ulangan &.Xususan, animalToFood turidagi argumentga qo'llanganda Tovuq turdagi turdagi ob'ektni qaytaradi Tuxum, va turdagi argumentga qo'llanganda Sigir turdagi turdagi ob'ektni qaytaradi Sut.Ideal, animalToFood a ega bo'lgan (ehtimol tasodifan) ob'ektga nisbatan qo'llanilmasligi kerak mahsulot usul.

// tovuq berildi, tuxum ishlab chiqaradi; sigir beriladi, sut beradiruxsat bering animalToFood: ((_: Tovuq) => Tuxum) & ((_: Sigir) => Sut) =    funktsiya (hayvon: har qanday) {        qaytish hayvon.mahsulot();    };

Nihoyat, quyidagi dastur kodi namoyish etadi xavfsiz turi yuqoridagi ta'riflardan foydalanish.

 1 var tovuq = yangi Tovuq(); 2 var sigir = yangi Sigir(); 3 var randomNumberGenerator = yangi RandomNumberGenerator(); 4  5 konsol.jurnal(tovuq.mahsulot()); //Tuxum { } 6 konsol.jurnal(sigir.mahsulot()); //Sut { } 7 konsol.jurnal(randomNumberGenerator.mahsulot()); //0.2626353555444987 8  9 konsol.jurnal(animalToFood(tovuq)); //Tuxum { }10 konsol.jurnal(animalToFood(sigir)); //Sut { }11 //console.log(animalToFood(randomNumberGenerator)); // XATO: 'RandomNumberGenerator' turidagi argumentni 'Cow' tipidagi parametr bilan bog'lab bo'lmaydi12 13 konsol.jurnal(eatEgg(animalToFood(tovuq))); // Men tuxum yeydim.14 //console.log(eatEgg(animalToFood(cow))); // XATO: "Sut" turidagi argument "Egg" turidagi parametrga mos kelmaydi.15 konsol.jurnal(ichimlik suti(animalToFood(sigir))); // Bir oz sut ichdim.16 //console.log(drinkMilk(animalToFood(chicken))); // XATO: 'Egg' turidagi argument 'Milk' parametriga berilmaydi

Yuqoridagi dastur kodi quyidagi xususiyatlarga ega:

  • 1-3 qatorlar ob'ektlarni yaratadi tovuq, sigirva randomNumberGenerator ularning tegishli turiga.
  • 5-7 qatorlar ilgari yaratilgan ob'ektlar uchun qo'ng'iroq paytida tegishli natijalar (izoh sifatida berilgan) chop etiladi mahsulot.
  • 9-satr (10-son) ushbu usuldan xavfsiz foydalanish usulini namoyish etadi animalToFood uchun qo'llaniladi tovuq (resp. sigir).
  • 11-satr, agar bajarilmasa, kompilyatsiya vaqtida turdagi xatolarga olib keladi. Garchi amalga oshirish ning animalToFood chaqirishi mumkin mahsulot usuli randomNumberGenerator, izohlash turi ning animalToFood buni taqiqlaydi. Bu mo'ljallangan ma'nosiga mos keladi animalToFood.
  • 13-qator (15-qism) ushbu amalni namoyish etadi animalToFood ga tovuq (resp. sigir) turdagi ob'ektga olib keladi Tuxum (resp. Sut).
  • 14-satr (16-son) ushbu amalni namoyish etadi animalToFood ga sigir (resp. tovuq) turdagi ob'ektga olib kelmaydi Tuxum (resp. Sut). Shuning uchun, agar izoh berilmagan bo'lsa, 14-qator (16-band) kompilyatsiya vaqtida turdagi xatolarga olib keladi.

Meros bilan taqqoslash

Yuqoridagi minimalist misol yordamida amalga oshirish mumkin meros olish Masalan, sinflarni chiqarish orqali Tovuq va Sigir asosiy sinfdan HayvonAmmo, kattaroq sharoitda, bu noqulay bo'lishi mumkin. Yangi sinflarni sinf ierarxiyasiga kiritish shart emas o'zaro faoliyat tashvishlari, yoki masalan, tashqi kutubxonadan foydalanganda, umuman imkonsizdir. Tasavvur qilingki, yuqoridagi misol quyidagi sinflar bilan kengaytirilishi mumkin:

  • sinf Ot unda yo'q mahsulot usul;
  • sinf Qo'y bu bor mahsulot usulni qaytarish Jun;
  • sinf Cho'chqa bu bor mahsulot faqat bir marta ishlatilishi mumkin bo'lgan usul Go'sht.

Buning uchun qo'shimcha usullar (yoki interfeyslar) ishlab chiqarish usuli mavjudligini, ishlab chiqarish usuli oziq-ovqat mahsulotlarini qaytarib beradimi yoki takroriy ravishda ishlab chiqarish usulidan foydalanish mumkinligini aniqlaydigan umumiy sinflarni talab qilishi mumkin. Umuman olganda, bu sinf ierarxiyasini ifloslantirishi mumkin.

O'rdak terish bilan taqqoslash

Yuqoridagi minimalist misol buni allaqachon ko'rsatib turibdi o'rdak terish berilgan stsenariyni amalga oshirish uchun unchalik mos emas RandomNumberGenerator o'z ichiga oladi mahsulot usuli, ob'ekti randomNumberGenerator uchun dalil bo'lmasligi kerak animalToFood.Yuqoridagi misolni o'rdak terish yordamida, masalan, yangi maydonni kiritish orqali amalga oshirish mumkin argumentForAnimalToFood sinflarga Tovuq va Sigir tegishli turdagi ob'ektlar uchun tegishli dalillar ekanligini bildiradi animalToFood.Bu bilan birga, bu nafaqat tegishli sinflar hajmini ko'paytiradi (ayniqsa, shunga o'xshash usullarni kiritish bilan) animalToFood), shuningdek, nisbatan mahalliy bo'lmagan yondashuv animalToFood.

Funktsiyaning haddan tashqari yuklanishi bilan taqqoslash

Yuqoridagi misol yordamida amalga oshirish mumkin funktsiyani haddan tashqari yuklash Masalan, ikkita usulni qo'llash orqali animalToFood(hayvon: Tovuq): Tuxum va animalToFood(hayvon: Sigir): Sut.TypeScript-da, bunday echim keltirilgan misol bilan deyarli bir xil. Kabi boshqa dasturlash tillari Java, haddan tashqari yuklangan usulni aniq tatbiq etishni talab qiladi, bu ham sabab bo'lishi mumkin kodni takrorlash yoki qozon plitasi.

Tashrif buyuruvchilar bilan taqqoslash

Yuqoridagi misolni yordamida amalga oshirish mumkin mehmonlar namunasi.Bu har bir hayvon sinfidan qabul qilish interfeysni amalga oshiradigan ob'ektni qabul qilish usuli HayvonVizitor (mahalliy bo'lmaganlarni qo'shish qozon plitasi Funktsiya animalToFood sifatida amalga oshiriladi tashrif amalga oshirish usuli HayvonVizitorAfsuski, kirish turi (Tovuq yoki Sigir) va natija turi (Tuxum yoki Sut) vakillik qilish qiyin bo'lar edi.

Cheklovlar

Bir tomondan, kesishish turlari mumkin funktsiyalarga turli xil turlarni izohlash uchun sinf ierarxiyasiga yangi sinflar (yoki interfeyslar) kiritmasdan foydalaniladi. Boshqa tomondan, bu yondashuv talab qiladi barcha mumkin bo'lgan argument turlari va natija turlari aniq ko'rsatilishi kerak, agar funktsiya harakati aniq birlashtirilgan interfeys tomonidan aniqlanishi mumkin bo'lsa, parametrik polimorfizm, yoki o'rdak terish, keyin kesishish turlarining so'zma-so'zligi noqulaydir, shuning uchun kesishish turlari mavjud spetsifikatsiya usullarini to'ldiruvchi hisoblanadi.

Bog'liq kesishish turi

A qaram kesma turi, belgilangan , a qaram tur unda turi o'zgaruvchiga bog'liq bo'lishi mumkin .[6]Xususan, agar muddat qaram kesma turiga ega , keyin muddat bor ikkalasi ham turi va turi , qayerda o'zgaruvchisi atamasining barcha ko'rinishini almashtirish natijasida kelib chiqadigan tur yilda muddat bo'yicha .

Scala misoli

Scala turdagi deklaratsiyalarni qo'llab-quvvatlaydi [7] ob'ekt a'zolari sifatida. Bu ob'ekt a'zolarining bir turi boshqa a'zoning qiymatiga bog'liq bo'lishiga imkon beradi, bu esa a deb nomlanadi yo'lga bog'liq tur.[8]Masalan, quyidagi dastur matni Scala xususiyatini belgilaydi Guvoh, amalga oshirish uchun ishlatilishi mumkin singleton naqshlari.[9]

xususiyat Guvoh {  turi T  val qiymat: T {}}

Yuqoridagi xususiyat Guvoh a'zoligini e'lon qiladi T, tayinlanishi mumkin bo'lgan turi uning qiymati sifatida va a'zosi qiymat, unga turdagi qiymat berilishi mumkin T.Quyidagi dastur matni ob'ektni belgilaydi booleanWitness yuqoridagi xususiyatning misoli sifatida Guvoh.Obyekt booleanWitness turini belgilaydi T kabi Mantiqiy va qiymati qiymat kabi to'g'ri.Masalan, ijro etish Tizim.chiqib.println(booleanWitness.qiymat) tazyiqlar to'g'ri konsolda.

ob'ekt booleanWitness uzaytiradi Guvoh {  turi T = Mantiqiy  val qiymat = to'g'ri}

Ruxsat bering turi bo'ling (xususan, a yozuv turi ) a'zosi bo'lgan ob'ektlar turdagi .Yuqoridagi misolda ob'ekt booleanWitness qaram kesma turini belgilash mumkin .Fikrlash quyidagicha. Ob'ekt booleanWitness a'zosi bor T turi berilgan Mantiqiy uning qiymati sifatida.Sin Mantiqiy turi, ob'ekti booleanWitness turiga ega .Bundan tashqari, ob'ekt booleanWitness a'zosi bor qiymat unga qiymat beriladi to'g'ri turdagi Mantiqiy.Qiymatidan beri booleanWitness.T bu Mantiqiy, ob'ekt booleanWitness turiga ega .Umuman, ob'ekt booleanWitness kesishish turiga ega .Shuning uchun o'z-o'ziga havolani bog'liqlik, ob'ekt sifatida taqdim etish booleanWitness qaram kesma turiga ega .

Shu bilan bir qatorda, yuqoridagi minimalist misol yordamida tavsiflash mumkin qaram yozuv turlari.[10]Qarama-qarshi kesishgan turlarga nisbatan, qaram yozuv turlari aniqroq ixtisoslashgan tipdagi nazariy tushunchani tashkil etadi.[6]

Turli oilalarning kesishishi

An tipdagi oilaning kesishishi, belgilangan , a qaram tur unda turi o'zgaruvchiga bog'liq bo'lishi mumkin .[6]Xususan, agar muddat turiga ega , keyin uchun har biri muddat turdagi , atama turiga ega .Bu tushuncha ham deyiladi yashirin Pi turi,[11] dalilni kuzatish muddatli darajada saqlanmaydi.

Tillarni kesishish turlari bilan taqqoslash

TilFaol ishlab chiqilganParadigma (lar)HolatXususiyatlari
C #Ha[12]Muhokama qilinmoqda[13]?
SeylonHa[14]Qo'llab-quvvatlanadi[15]
  • Noziklashning turi
  • Interfeys tarkibi
  • Kenglik bo'yicha pastki yozuv
F #Ha[16]Muhokama qilinmoqda[17]?
OqimHa[18]Qo'llab-quvvatlanadi[19]
  • Noziklashning turi
  • Interfeys tarkibi
BorsaytYo'qQo'llab-quvvatlanadi[20]
  • Funktsiya turi kesishmasi
  • Distributiv, qo'shma va qarama-qarshi funktsiya turi subtipasi
JavaHa[21]Qo'llab-quvvatlanadi[22]
  • Noziklashning turi
  • Interfeys tarkibi
  • Kenglik bo'yicha pastki yozuv
ScalaHa[23]Qo'llab-quvvatlanadi[24][25]
  • Noziklashning turi
  • Xususiyat tarkibi
  • Kenglik bo'yicha pastki yozuv
TypeScriptHa[26]Qo'llab-quvvatlanadi[5]
  • Ixtiyoriy turdagi kesishma
  • Interfeys tarkibi
  • Kenglik va chuqurlikdagi subtitr
WhileyHa[27]Qo'llab-quvvatlanadi[28]?

Adabiyotlar

  1. ^ Barendregt, Xenk; Coppo, Mario; Dezani-Siankaglini, Mariangiola (1983). "Filtrning lambda modeli va turga to'liqligi". Symbolic Logic jurnali. 48 (4): 931–940. doi:10.2307/2273659. JSTOR  2273659.
  2. ^ Palsberg, Jens (2012). "Haddan tashqari yuk NP-Complete". Mantiq va dastur semantikasi. Kompyuter fanidan ma'ruza matnlari. 7230. 204-218 betlar. doi:10.1007/978-3-642-29485-3_13. ISBN  978-3-642-29484-6.
  3. ^ Xenk Barendregt; Uil Dekkers; Richard Statman (2013 yil 20-iyun). Lambda hisob-kitoblari turlari bilan. Kembrij universiteti matbuoti. 1–3 betlar. ISBN  978-0-521-76614-2.
  4. ^ Gilezan, Silviya (1996). "Kesishish turlari bilan kuchli normallashtirish va yozish". Notre Dame Rasmiy Mantiq jurnali. 37 (1): 44–52. doi:10.1305 / ndjfl / 1040067315.
  5. ^ a b "TypeScript-dagi kesishish turlari". Olingan 2019-08-01.
  6. ^ a b v Kopylov, Aleksey (2003). "Bog'liq kesishma: turlar nazariyasida yozuvlarni aniqlashning yangi usuli". Kompyuter fanida mantiq bo'yicha IEEE 18-simpoziumi. LICS 2003. IEEE Kompyuter Jamiyati. 86-95 betlar. CiteSeerX  10.1.1.89.4223. doi:10.1109 / LICS.2003.1210048.
  7. ^ "Deklaratsiyani Scala-da yozing". Olingan 2019-08-15.
  8. ^ Amin, Nada; Grutter, Shomuil; Oderskiy, Martin; Rompf, Tiark; Stukki, Sandro (2016). "Qaram ob'ekt turlarining mohiyati". Dunyoni o'zgartirishi mumkin bo'lgan muvaffaqiyatlar ro'yxati - Filipp Vadlerning 60 yoshi munosabati bilan bag'ishlangan insholar. Kompyuter fanidan ma'ruza matnlari. 9600. Springer. 249-272 betlar. doi:10.1007/978-3-319-30936-1_14.
  9. ^ "Scala shaklsiz kutubxonasidagi singletonlar". Olingan 2019-08-15.
  10. ^ Pollack, Robert (2000). "Matematik tuzilmani aks ettirish uchun yozilgan yozuvlar". Yuqori darajadagi mantiqiylikni isbotlovchi teorema, 13-xalqaro konferentsiya. TPHOLs 2000. Springer. 462-479 betlar. doi:10.1007/3-540-44659-1_29.
  11. ^ Stump, Aaron (2018). "Amalga oshirilishdan induksiyaga qaramlik kesishmasi orqali". Sof va amaliy mantiq yilnomalari. 169 (7): 637–655. doi:10.1016 / j.apal.2018.03.002.
  12. ^ "C # qo'llanmasi". Olingan 2019-08-08.
  13. ^ "Munozara: C Sharp-da birlashma va kesishma turlari". Olingan 2019-08-08.
  14. ^ "Tutilish Seylon: Seylonga xush kelibsiz". Olingan 2019-08-08.
  15. ^ "Seyloning kesishgan turlari". Olingan 2019-08-08.
  16. ^ "F # dasturiy ta'minot fondi". Olingan 2019-08-08.
  17. ^ "F Sharp-ga kesishish turlarini qo'shish". Olingan 2019-08-08.
  18. ^ "Oqim: JavaScript uchun statik tip tekshiruvi". Olingan 2019-08-08.
  19. ^ "Oqimdagi kesishma turi sintaksisi". Olingan 2019-08-08.
  20. ^ Reynolds, J. C. (1988). Forsythe dasturlash tilining dastlabki dizayni.
  21. ^ "Java Software". Olingan 2019-08-08.
  22. ^ "IntersectionType (Java SE 12 va JDK 12)". Olingan 2019-08-01.
  23. ^ "Scala dasturlash tili". Olingan 2019-08-08.
  24. ^ "Skalaning aralash turlari". Olingan 2019-08-01.
  25. ^ "Dottidagi kesishish turlari". Olingan 2019-08-01.
  26. ^ "TypeScript - o'lchovni ta'minlaydigan JavaScript". Olingan 2019-08-01.
  27. ^ "Whiley: kengaytirilgan statik tekshiruv bilan ochiq kodli dasturlash tili". Olingan 2019-08-01.
  28. ^ "Whiley tilining spetsifikatsiyasi" (PDF). Olingan 2019-08-01.