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?
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 ...
Option
namanya. Kenapa tidak Optional
! Mungkin karena saya bukan penutur asli, tetapi Option
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-ruby
Saya selalu menyukai void *
. Mungkin itu adalah gejala dari sesuatu yang sangat cacat dalam diri saya.
void *
dan Pascal / Delphi miliki Pointer
.
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).
Saya terkejut belum ada yang menyebutkan Monads atau Datatypes Aljabar.
Lisp memiliki dua tipe menarik: t
dan nil
. Yang menarik tentang mereka adalah bahwa semuanya adalah t
dan tidak ada yang nil
.
nil
a t
?
SNOBOL: pattern (dasarnya pohon parser LL (1), jika saya mengingatnya dengan benar).
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.
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
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 .
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.
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:
Object
-> Atom
-> Sequence
Urutan = Urutan Objek
-- examples of atoms:
0
98.6
-1e6
-- examples of sequences:
{2, 3, 5, 7, 11, 13, 17, 19}
{1, 2, {3, 3, 3}, 4, {5, {6}}}
{{"jon", "smith"}, 52389, 97.25}
{} -- the 0-element sequence
Lihat: Manual Rujukan
Catatan: "jon" sebenarnya adalah cara singkat menulis urutan nilai ASCII. Misalnya "ABCDEFG"
sama dengan{65, 66, 67, 68, 69, 70, 71}
Felix memiliki jenis jumlah anonim. Jenisnya ditulis seperti:
typedef il = int + long;
seperti dalam teori. Nilai-nilainya jelek:
case 0 of il (1)
case 1 of il (2L)
kecuali mungkin untuk jumlah unit seperti 3 = 1 + 1 + 1
case 0 of 3
case 1 of 3
yang sayangnya menggunakan penghitungan asal nol untuk "Kompatibilitas C". Jumlah anonim diperlukan untuk jenis aljabar yang diketik secara struktural, misalnya:
(1 + T * li) as li
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:
typedef void = 0;
typedef unit = 1;
typedef bool = 2;
dan notasi ini:
T ^ 3
adalah array dengan panjang statis 3 .. 3 bukan bilangan bulat tetapi jumlah 3 unit. Sayang sekali + tidak asosiatif :)
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):
people:([]name:`Joe`Amy`Sarah; age:17 15 18; GPA:3.5 3.8 3.33)
Sekarang saya bisa melihat meja saya:
q)show people
name age GPA
--------------
Joe 17 3.5
Amy 15 3.8
Sarah 18 3.33
Dan saya dapat menanyakannya:
q)select from people where GPA>3.4
name age GPA
------------
Joe 17 3.5
Amy 15 3.8
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.
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
f(Foo, Bar)
sama dengan fungsi f(Foo)
yang mengembalikan fungsi lain f'(Bar)
yang mengembalikan nilai apa yang f(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'.
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).
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 dan undefined
javascript, tetapi tidak void
dalam C atau C ++. void
gagal Meskipun menggambarkan nilai tanpa informasi, tetapi tidak ada nilai aktual yang dapat diketik void
.
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.
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
.
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.
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
:
type time is range <machine dependant> to <machine dependant>
units
fs;
ps = 1000 fs;
ns = 1000 ps;
us = 1000 ns;
Ms = 1000 us;
sec = 1000 ms;
min = 60 sec;
hr = 60 min;
end units;
Bersama dengan overloading operator, Anda dapat mendefinisikan hal-hal yang sangat menarik.
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
Googles Go memiliki tipe "Saluran" yang cukup unik.