Birlik turi - Unit type

Hududida matematik mantiq va Kompyuter fanlari sifatida tanilgan tip nazariyasi, a birlik turi a turi bu faqat bitta qiymatga imkon beradi (va shu bilan hech qanday ma'lumotga ega bo'lmaydi). Birlik turi bilan bog'liq bo'lgan tashuvchi (asosiy to'plam) har qanday bo'lishi mumkin singleton to'plami. Bor izomorfizm har qanday ikkita to'plam o'rtasida, shuning uchun bu haqda gapirish odatiy holdir The birlik turi va uning qiymati tafsilotlarini e'tiborsiz qoldiring. Bundan tashqari, birlik turini 0- ning turi deb hisoblash mumkinkoreyslar, ya'ni mahsulot hech qanday turdagi.

Birlik turi terminal ob'ekti ichida toifasi turlari va yozilgan funktsiyalari. Bilan aralashtirmaslik kerak nol yoki pastki turi bu imkon beradi yo'q qiymatlari va boshlang'ich ob'ekt ushbu toifadagi. Xuddi shunday, Mantiqiy bilan turi ikkitasi qiymatlar.

Birlik turi ko'pchilikda amalga oshiriladi funktsional dasturlash tillari. The bekor turi ba'zi bir majburiy dasturlash tillarida ishlatiladigan ba'zi bir funktsiyalarni bajaradi, lekin uning tashuvchisi to'plami bo'sh bo'lgani uchun u ba'zi cheklovlarga ega (quyida batafsil ma'lumot berilgan).

Dasturlash tillarida

Bir nechta kompyuter dasturlash tillari a natija turini belgilash uchun birlik turini taqdim eting funktsiya sabab bo'lishining yagona maqsadi bilan yon ta'sir, va argumentlarni talab qilmaydigan funktsiya argument turi.

  • Yilda Xaskell va Zang, birlik turi deyiladi () va uning yagona qiymati ham (), 0-karra talqinini aks ettiradi.
  • Yilda ML avlodlari (shu jumladan OCaml, Standart ML va F # ), turi deyiladi birlik ammo qiymati quyidagicha yoziladi ().
  • Yilda Scala, birlik turi deyiladi Birlik va uning yagona qiymati quyidagicha yoziladi ().
  • Yilda Umumiy Lisp nomi berilgan tur NULL bitta qiymatga ega bo'lgan birlik turi, ya'ni belgi NIL. Bu bilan chalkashtirmaslik kerak NIL turi, bu pastki turi.
  • Yilda Python, deb nomlangan turi mavjud NoneType ning yagona qiymatiga imkon beradi Yo'q.
  • Yilda Tez, birlik turi deyiladi Bekor yoki () va uning yagona qiymati ham (), 0-karra talqinini aks ettiradi.
  • Yilda Boring, birlik turi yozilgan struct {} va uning qiymati struct {} {}.
  • Yilda PHP, birlik turi null deb nomlanadi, uning qiymati faqat NULLning o'zi.
  • Yilda JavaScript, ham null, ham aniqlanmagan birlik turlari.
  • yilda Kotlin, Birlik yagona qiymatga ega singleton: the Birlik ob'ekt.
  • Yilda Yoqut, nol ning yagona misoli NilClass sinf.
  • Yilda C ++, std :: monostate birlik turi C ++ 17 da qo'shilgan. Bundan oldin kabi bo'sh struktura yordamida maxsus birlik turini aniqlash mumkin struct bo'sh {}.

Void turi birlik turi sifatida

Yilda C, C ++, C #, D. va Java, bekor foydali hech narsa keltirmaydigan yoki argumentlarni qabul qilmaydigan funktsiyani belgilash uchun ishlatiladi. C dagi birlik turi kontseptual jihatdan bo'shga o'xshaydi tuzilmaviy, lekin C tili spetsifikatsiyasida a'zolarsiz tuzilishga yo'l qo'yilmaydi (bunga C ++ da ruxsat beriladi). Buning o'rniga,bekor'quyida batafsil aytib o'tilganidek, birlik turlarining ba'zi bir xususiyatlarini emas, balki barchasini simulyatsiya qiladigan tarzda ishlatiladi. Ko'pgina imperativ tillar singari C ham qiymat qaytarmaydigan funktsiyalarga ruxsat beradi; bu bo'sh qaytarish turiga ega deb ko'rsatilgan. Bunday funktsiyalar boshqa imperativ tillarda protseduralar deb nomlanadi Paskal, bu erda funktsiyalar va protseduralar o'rtasida tip-tizim farqi o'rniga sintaktik ajratish amalga oshiriladi.

Konvensiyani chaqirishdagi farq

Haqiqiy birlik turi va bo'shliq turi o'rtasidagi birinchi sezilarli farq shundaki, birlik turi har doim funktsiya argumentining turi bo'lishi mumkin, ammo bo'sh joy turi bo'lishi mumkinligiga qaramay, C da argument turi bo'lishi mumkin emas. ro'yxatdagi yagona dalil sifatida ko'rinadi. Ushbu muammoni quyidagi dastur yaxshi ko'rsatib beradi, bu C-da kompilyatsiya vaqtida xato:

bekor f(bekor) {}bekor g(bekor) {}int asosiy(bekor){  f(g()); // bu erda kompilyatsiya vaqtidagi xato  qaytish 0;}

Ushbu muammo C dasturlash amaliyotining ko'pchiligida paydo bo'lmaydi, chunki beri bekor turi hech qanday ma'lumotga ega emas, uni baribir topshirish foydasiz; lekin u paydo bo'lishi mumkin umumiy dasturlash, masalan, C ++ andozalar, qayerda bekor boshqa turlardan farqli ravishda muomala qilinishi kerak. Ammo C ++ da bo'sh sinflarga ruxsat beriladi, shuning uchun haqiqiy birlik turini amalga oshirish mumkin; yuqoridagi misol quyidagicha kompilyatsiya qilinadi:

sinf birlik_tipi {};konst birlik_tipi birlik;birlik_tipi f(birlik_tipi) { qaytish birlik; }birlik_tipi g(birlik_tipi) { qaytish birlik; }int asosiy(){  f(g(birlik));  qaytish 0;}

(Qisqartirish uchun biz yuqoridagi misolda tashvishlanmaymizmi yoki yo'qmi birlik haqiqatan ham singleton; qarang singleton naqshlari ushbu masala bo'yicha tafsilotlar uchun.)

Saqlashdagi farq

Ikkinchi diqqatga sazovor farq shundaki, bo'shliq turi maxsus va uni hech qachon a ichida saqlash mumkin emas yozuv turi, ya'ni C / C ++ dagi struct yoki sinfda. Aksincha, birlik turi funktsional dasturlash tillaridagi yozuvlarda saqlanishi mumkin, ya'ni maydon turi sifatida paydo bo'lishi mumkin; yuqoridagi birlik turini C ++ da amalga oshirish ham saqlanishi mumkin. Bu foydasiz xususiyat bo'lib tuyulishi mumkin bo'lsa-da, masalan, a-ni oqilona amalga oshirishga imkon beradi o'rnatilgan kabi xarita birlik turiga; birlik turi bo'lmagan taqdirda, har bir kalit uchun boshqa turdagi ba'zi qo'g'irchoq qiymatlarni saqlash orqali to'plamni shu tarzda amalga oshirish mumkin.

Generika-da

Java Generics-da tip parametrlari mos yozuvlar turlari bo'lishi kerak. Qopqoq turi Bekor birlik turi parametri kerak bo'lganda tez-tez ishlatiladi. Garchi Bekor turi hech qachon biron bir misolga ega bo'lmaydi, bitta qiymatga ega, bekor (boshqa barcha mos yozuvlar turlari kabi), shuning uchun u birlik turi vazifasini bajaradi. Amalda, har qanday boshqa noaniq turdagi, masalan. Matematika, bu maqsadda ham foydalanish mumkin, chunki ular ham bitta qiymatga ega, bekor.

jamoat statik Bekor f(Bekor x) { qaytish bekor; }jamoat statik Bekor g(Bekor x) { qaytish bekor; }jamoat statik bekor asosiy(Ip[] kamon){    f(g(bekor));}

Shuningdek qarang

  • Singleton naqshlari (bu erda ma'lum bir sinfda faqat bitta misol mavjud, ammo unga tor doirada yozilgan null bo'lmagan havolalar odatda boshqa sinflar tomonidan qo'llanilmaydi)

Adabiyotlar

  • Pirs, Benjamin S (2002). Dasturlash turlari va turlari. MIT Press. 118–119 betlar. ISBN  0-262-16209-1.
  • birlik turi yilda nLab