Kita semua melihat integer, floating point, string, dan tipe desimal sesekali. Apa saja jenis yang paling aneh atau unik atau berguna yang pernah Anda temui, bermanfaat atau tidak?
20
Kita semua melihat integer, floating point, string, dan tipe desimal sesekali. Apa saja jenis yang paling aneh atau unik atau berguna yang pernah Anda temui, bermanfaat atau tidak?
Jawaban:
Saya akan pendek:
Maybe a
di Haskell.
Dengan konstruksi sederhana ini, bahasanya memecahkan masalah tabrakan atau
NullPointerException
, itu dengan rapi menghindari "Satu Kesalahan Sejuta" dari Tony Hoare :)Terus terang, keberadaan opsional diperiksa pada waktu kompilasi? Seperti mimpi ...
sumber
Option
namanya. Kenapa tidakOptional
! Mungkin karena saya bukan penutur asli, tetapiOption
tidak menyampaikan makna "opsional" kepada saya.Maybe
Nama lucu: "Apa yang Anda miliki?" "Mungkin sebuah Int". Namun, bagian yang benar-benar rapi adalah bahwa itu adalah functor dan monad yang, secara sederhana, berarti Anda mendapatkan propagasi nol secara gratis. Anda tidak perlu meletakkan cek kosong di dalam fungsi atau di tengah kode Anda; Anda hanya perlu memeriksanya di bagian paling akhir kode Anda, jika sama sekali.Maybe
monad untuk Ruby: lostechies.com/derickbailey/2010/10/10/the-maybe-monad-in-rubySaya selalu menyukai
void *
. Mungkin itu adalah gejala dari sesuatu yang sangat cacat dalam diri saya.sumber
void *
dan Pascal / Delphi milikiPointer
.Lua memiliki meja bawaan yang paling mengesankan. Ini memiliki hashtable bawaan dan vektor, dan dengan penggunaan metatables dapat menjadi dasar fundamental untuk pemrograman berorientasi objek dalam bahasa prosedural.
Setiap indeks dari suatu tabel dapat menerima salah satu dari struktur bahasa dasar (angka, boolean, string, fungsi -ya, fungsi adalah tipe pada lua -, dan tabel).
sumber
Saya terkejut belum ada yang menyebutkan Monads atau Datatypes Aljabar.
sumber
Lisp memiliki dua tipe menarik:
t
dannil
. Yang menarik tentang mereka adalah bahwa semuanya adalaht
dan tidak ada yangnil
.sumber
nil
at
?SNOBOL: pattern (dasarnya pohon parser LL (1), jika saya mengingatnya dengan benar).
sumber
Fortran memiliki blok umum; itu salah satu tipe data yang paling tidak umum dalam bahasa modern, atau, lebih tepatnya cara yang tidak biasa untuk berbagi data secara efisien.
Fortran 95 memiliki tipe interval dan built-in interval arithmetics.
Daftar tidak akan lengkap tanpa jenis monadik yang ditemukan di Haskell. Untuk memahaminya, Anda perlu sedikit usaha.
sumber
Delphi memiliki set ( lihat juga ), yang saya tidak percaya diterapkan dengan cara yang sama dalam bahasa lain.
Ini membuat penyimpanan atribut multi-variabel dalam basis data menjadi mudah: D
sumber
Saya kira itu benar-benar aneh datang dari pemrograman pada arsitektur klasik, tetapi tentu saja salah satu tipe tersulit bagi saya untuk membungkus kepala saya pada awalnya adalah register kuantum , yang muncul di QCL .
sumber
PL / SQL memungkinkan Anda mendeklarasikan variabel tipe
my_table.some_column%type
... Saya menemukan itu sangat berguna.Dan C # memungkinkan Anda mendeklarasikan objek sebagai nullable atau tidak, meskipun saya tidak yakin itu dianggap sebagai tipe.
sumber
cursor%rowtype
bahkan lebih lucu: ini adalah tipe catatan yang dibentuk secara dinamis yang mencerminkan kolom mana yang dikembalikan kueri kursor.Aku punya titik lemah di hatiku tipe data Euphoria ketika saya masih muda
Ini disusun sebagai berikut:
Urutan = Urutan Objek
Lihat: Manual Rujukan
Catatan: "jon" sebenarnya adalah cara singkat menulis urutan nilai ASCII. Misalnya
"ABCDEFG"
sama dengan{65, 66, 67, 68, 69, 70, 71}
sumber
Felix memiliki jenis jumlah anonim. Jenisnya ditulis seperti:
seperti dalam teori. Nilai-nilainya jelek:
kecuali mungkin untuk jumlah unit seperti
3 = 1 + 1 + 1
yang sayangnya menggunakan penghitungan asal nol untuk "Kompatibilitas C". Jumlah anonim diperlukan untuk jenis aljabar yang diketik secara struktural, misalnya:
adalah daftar (terhubung secara tunggal) dari T. Semua bahasa lain yang saya tahu jumlah yang diperlukan harus diketik secara nominal, di mana kedua jenis itu sendiri dan konstruktor harus diberi nama.
Steno 3 yang digunakan di atas lucu, berikut ini ada di perpustakaan:
dan notasi ini:
adalah array dengan panjang statis 3 .. 3 bukan bilangan bulat tetapi jumlah 3 unit. Sayang sekali + tidak asosiatif :)
sumber
q / kdb + memiliki tabel . Karena itu adalah bahasa pemrograman dan basis data yang berorientasi kolom dalam satu, tidak perlu untuk LINQ atau ORM.
Sebagai contoh, dapat membuat tabel seperti ini (tugas dibedakan dengan
:
tidak=
seperti dalam kebanyakan bahasa):Sekarang saya bisa melihat meja saya:
Dan saya dapat menanyakannya:
sumber
Saya menemukan serikat pekerja di C ++ menjadi 'aneh' ketika saya pertama kali mendengar tentang mereka. Saya masih belum mencapai skenario di mana mereka adalah pilihan yang jelas untuk diterapkan.
sumber
Saya masih mencoba untuk membungkus kepala saya di sekitar apa fungsi multi-parameter menjadi dalam F # dan bahasa fungsional lainnya. Pada dasarnya int f (Foo, Bar) menjadi func f (Foo)
Itu adalah dua fungsi parameter yang mengambil Foo, dan Bilah dan mengembalikan sebuah int sebenarnya adalah fungsi satu parameter yang mengambil Foo dan mengembalikan fungsi satu parameter yang mengambil bilah dan mengembalikan sebuah int. Tapi entah bagaimana Anda bisa menyebutnya dengan dua parameter jika Anda mau. Saya menulis posting tentang itu di sini
sumber
f(Foo, Bar)
sama dengan fungsif(Foo)
yang mengembalikan fungsi lainf'(Bar)
yang mengembalikan nilai apa yangf(Foo, Bar)
akan kembali. Artinya, jika Anda memperbaiki argumen 'Foo', tetapi bukan 'Bar', Anda memiliki fungsi yang tidak bergantung pada 'Foo' tetapi masih tergantung pada argumen 'Bar'. Ini tipikal untuk bahasa fungsional; itu disebut 'kari'.Ekspresi Reguler:
Mereka adalah objek yang sangat kuat namun kompak.
Bahasa yang telah mereka miliki memiliki kemampuan besar untuk memanipulasi teks (jangan sampai mendengar kata parse mereka tidak sebaik itu).
sumber
Sejumlah bahasa dalam keluarga fungsional memiliki kelas jenis yang dikenal sebagai Unity. Fitur yang membedakan dari tipe Unity adalah bahwa mereka tidak mengandung informasi, mereka adalah tipe bit nol. Jenis kesatuan (dalam beberapa variasi) juga merupakan satu-satunya nilainya, atau (dalam sebagian besar lainnya) hanya memiliki satu nilai (yang bukan tipe itu sendiri).
Ini berguna, meskipun, karena mereka adalah tipe yang dibedakan. Karena Anda tidak dapat secara implisit mengkonversi dari satu jenis kesatuan ke yang lain, Anda dapat menggunakan pemeriksaan jenis statis agar bekerja dengan cara yang sangat efisien dan ekspresif.
Unity juga cara sebagian besar bahasa tersebut menggambarkan Enums, dengan memungkinkan jenis baru menjadi salah satu dari rangkaian jenis lainnya, atau untuk menggambarkan mungkin tipe, nilai yang bisa berupa nilai tipe tipikal (misalnya, integer) , atau memiliki nilai yang mewakili nilai-tidak.
Beberapa bahasa yang tidak menggunakan kekayaan jenis kesatuan yang ditentukan pengguna masih memiliki kesatuan di dalamnya, dalam beberapa bentuk atau lainnya. Sebagai contoh, Python memiliki setidaknya tiga jenis kesatuan,
NoneType
,NotImplementedType
, danEllipsisType
. Sangat menarik bahwa dua yang pertama keduanya berarti sesuatu seperti "Tidak ada nilai", tetapi yang ketiga digunakan dalam nilai-nilai kompleks (khususnya, ekspresi irisan) untuk mewakili kasus khusus yang menarik.Contoh menarik lainnya dari kesatuan termasuk
NULL
dalam sql danundefined
javascript, tetapi tidakvoid
dalam C atau C ++.void
gagal Meskipun menggambarkan nilai tanpa informasi, tetapi tidak ada nilai aktual yang dapat diketikvoid
.sumber
symbol
Tipe Ruby agak tidak biasa. Ini pada dasarnya adalah string yang menerapkan pola singleton. Atau sesuatu. Sejauh ini, saya telah menemukan penggunaan terbaik untuk simbol dalam status pelacakan dan memberikan nama fungsi.sumber
COBOL. Pada dasarnya hanya dua tipe data dasar, string dan angka, tetapi Anda harus menentukan dengan tepat bagaimana mereka diletakkan dalam memori, misalnya
PIC S9(5)V99 COMP-3
.sumber
S
= ditandatangani,9(5)
= 5 digit,V
= titik desimal implisit,99
= 2 digit lebih banyak,COMP-3
= BCD + tanda nybble.Clipper memiliki 'Blok Kode', yang mirip dengan metode anonim. Mereka dapat diedarkan dan dievaluasi sesuai kebutuhan, biasanya sebagai bentuk panggilan balik. Anda sering menggunakannya untuk melakukan hal-hal seperti melakukan perhitungan dengan cepat saat menyajikan tabel data.
sumber
VHDL memiliki tipe fisik. Literal dari tipe tersebut mencakup nilai dan satuan. Anda juga dapat mendefinisikan subunit. Misalnya, tipe fisik yang sudah ditentukan sebelumnya adalah
time
:Bersama dengan overloading operator, Anda dapat mendefinisikan hal-hal yang sangat menarik.
sumber
Clojure menarik karena memiliki meta-konsep "abstraksi" yang meliputi bahasa. Contoh:
Hingga taraf tertentu, abstraksi mengambil " prinsip tanggung jawab tunggal " ke ekstrem. Terserah Anda untuk menyusunnya untuk mendapatkan fungsionalitas yang Anda inginkan, tetapi Anda bisa sangat fleksibel tentang cara Anda merekatkannya.
Misalnya, jika Anda menginginkan sistem OOP berbasis kelas dengan pewarisan, Anda dapat membangun satu dari abstraksi inti ini secara relatif cepat.
Dalam praktiknya, abstraksi itu sendiri dirancang sedemikian rupa sehingga banyak implementasi dimungkinkan, misalnya melalui antarmuka spesifik seperti clojure.lang.ISeq untuk urutan atau clojure.lang.IFn untuk fungsi urutan yang lebih tinggi.
Ada video yang menarik tentang topik ini: The Art of Abstraction
sumber
Jika Anda ingin bahasa dengan tipe yang unik, silakan menuju BCPL . Bahasa ini hanya memiliki satu tipe data, kata, menjadi jumlah bit tetap untuk implementasi bahasa.
sumber
Googles Go memiliki tipe "Saluran" yang cukup unik.
sumber