Jenis yang menarik atau unik dalam bahasa pemrograman? [Tutup]


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?


Hai user10008, selamat datang di Programmers.SE! Sudahkah Anda memeriksa FAQ kami ? Manakah dari enam pedoman subyektif yang menurut Anda memenuhi pertanyaan Anda?

4
Adakah yang mau menulis entri untuk Lisp?
Mark C

Saya pikir itu mungkin sebuah penipuan, tetapi hanya karena jawaban saya adalah sebuah penipuan, jadi saya akan memposting sebuah tautan dan mungkin Anda akan menemukan beberapa jawaban yang bagus: programmers.stackexchange.com/questions/724/…
Peter Turner

@ Mark: Saya sudah mencoba, tetapi tipe mungkin salah satu hal yang paling tidak menarik tentang Lisp.
Larry Coleman

@LarryC Saya pikir ini adalah pertanyaan sempurna untuk Lisp karena penggunaan daftar yang menyeluruh ! Daftar membentuk pohon sintaks dan ini memungkinkan Anda untuk menulis fungsi yang melakukan hal-hal luar biasa pada kode Anda, saya kumpulkan. Saya sedang belajar Racket (sebelumnya PLT Scheme ) sekarang. Lisp adalah satu-satunya bahasa pemrograman yang saya benar-benar termotivasi dan tertarik untuk belajar.
Mark C

Jawaban:


18

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 ...


1
Atau Opsi seperti yang disebut dalam banyak bahasa pemrograman lainnya.
Jonas

@Jonas: Saya harus mengakui bahwa saya tidak suka Optionnamanya. Kenapa tidak Optional! Mungkin karena saya bukan penutur asli, tetapi Optiontidak menyampaikan makna "opsional" kepada saya.
Matthieu M.

The MaybeNama 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.
Tikhon Jelvis


15

Saya selalu menyukai void *. Mungkin itu adalah gejala dari sesuatu yang sangat cacat dalam diri saya.


2
Iya nih. Saya takut itulah tepatnya. :) Oh, +1 untuk "menarik" dan bukan "unik". Objective-C jelas memiliki void *dan Pascal / Delphi miliki Pointer.
Frank Shearar

haha lebih dari tipe non, tetapi Anda tidak bisa membantah bahwa itu tidak kuat
user10008

15
Saya suka pesimisme yang terkandung di dalamnya: "Bisakah Anda melihat benda itu di sana?" "Ya, ada apa?", "Tidak tahu."
biziclop

Saya selalu berpikir itu lucu bahwa Anda tidak dapat mendeklarasikan kekosongan tetapi Anda dapat mengambil alamatnya. Menurut saya itu dengan struct s {int A; batal B; int C; } bahwa alamat B harus menjadi alamat celah antara A dan C. Tapi tidak, tidak diizinkan.
Andy Canfield

Itu sebabnya dalam "pointer" pascal digunakan untuk menunjukkan sebuah pointer generik, dan tidak membingungkan dengan "prosedur".
umlcat

14

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).


Perhatikan bagaimana Javascript dibangun dengan cara yang sangat mirip, dan Python dibangun di atas fondasi yang sama, seperti Ruby.
9000

Saya pikir ini juga mungkin di Perl dan PHP, ya?
FrustratedWithFormsDesigner

Ada perbedaan antara tabel di lua dan wadah hash dalam bahasa lain. Ada perbedaan implementasi yang halus dalam cara lua mendistribusikan nilai hash yang membuat tabelnya bekerja dengan cara yang hampir ajaib. Saya kebanyakan memprogram dalam python, dan kadang-kadang menemukan bahwa saya menggunakan asumsi yang tidak berlaku, berdasarkan harapan saya tentang cara tabel bekerja di lua. Contoh spesifik dari sihir ini adalah bahwa bilangan bulat hash untuk diri mereka sendiri + 1. Ini berarti bahwa kunci bilangan bulat dikemas padat, dan bahwa +0.0 dan -0.0 memiliki hash yang sama (mereka sama)
SingleNegationElimination

9

Saya terkejut belum ada yang menyebutkan Monads atau Datatypes Aljabar.


Mungkin tunjukkan pada kami contoh :)
nawfal

8

Lisp memiliki dua tipe menarik: tdan nil. Yang menarik tentang mereka adalah bahwa semuanya adalah tdan tidak ada yang nil.


Apakah kamu serius? Saya tidak tahu hal itu.
Mark C

Apakah nila t?
Jon Harrop


6

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.


Ah, UniData / UniVerse DBs juga memiliki blok umum dalam bahasa internal mereka (UniBasic).
Dan McGrath

Apakah blok umum adalah blok kode yang digunakan oleh berbagai bagian program?
Mark C

1
@MarkC IIRC pada dasarnya adalah data global, tetapi setiap fungsi yang mengakses harus secara eksplisit mengatakan akan di atas
jk.

5

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


4

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 .


3

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.


4
Tetapi cursor%rowtypebahkan lebih lucu: ini adalah tipe catatan yang dibentuk secara dinamis yang mencerminkan kolom mana yang dikembalikan kueri kursor.
9000

.NET "Nullable" sebenarnya merupakan tipe (generik) dalam dirinya sendiri.
Konamiman

3

Aku punya titik lemah di hatiku tipe data Euphoria ketika saya masih muda

Ini disusun sebagai berikut:

Object
-> Atom
-> Sequence
  • Atom = Nilai numerik tunggal
  • 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}


7
Ini terasa seperti LISP ...
FrustratedWithFormsDesigner

Jenis data aktual adalah satu-satunya bit.
Dan McGrath

1
@FrustratedWithForms Sama, saya berpikir, "Hei, dia berkata, 'Atom'! Ini terlihat seperti (a) Cuma tapi dengan pembagi yang tidak perlu.: P
Mark C

3

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 :)


2

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

2

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.


3
Serikat pekerja berasal dari C. Salah satu contoh yang baik adalah struct zval di php.
Martin Wickman

2
Saya telah menggunakannya dalam emulator Z80, untuk dengan mudah mengakses register 16 bit sebagai register utuh (HL, BC) dan sebagai register 8-bit (H, L, B dan C). Ini mencerminkan bagaimana mereka digunakan dalam Z80 asm. Juga di "varian", kelas yang dapat menyimpan nilai dari berbagai jenis (misalnya int / float) - tidak yakin mengapa saya tidak menggunakan subclass, tetapi masuk akal pada saat itu :)
ggambett

@ggambett: Saya telah melakukan hal yang persis sama untuk program Z80 saya! Hanya itu saya juga menambahkan bitfield untuk mengakses bendera individu dalam register F.
Konamiman

2

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


8
Sebaliknya, fungsi 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'.
9000

2

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).


2
Sangat mungkin untuk mem-parsing banyak tata bahasa sederhana dengan regex. Misalnya, relatif sepele untuk mem-parsing file ini dengan logika minimum di atas serangkaian regex. Kesalahan yang dilakukan banyak orang adalah mencoba menguraikan tata bahasa yang sangat kompleks dengannya (mis. XML / HTML).
Matthew Scharley


@Mark C: Jawaban teratas adalah (dengan rekor memecahkan 4320 suara). Anda tidak bisa
Martin York

Ya, itu untuk humor. Saya jadi teringat ketika saya membaca komentar Matthew.
Mark C

2

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 NULLdalam sql dan undefinedjavascript, tetapi tidak voiddalam C atau C ++. voidgagal Meskipun menggambarkan nilai tanpa informasi, tetapi tidak ada nilai aktual yang dapat diketik void.


Saya pikir maksud Anda "tipe unit".
Jason Baker

2

symbolTipe 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.


Juga sebagai kunci peta untuk perbandingan kunci O (1).
Jeremy Heiler

Yah, itu tidak terlalu aneh. Ruby mewarisinya dari Smalltalk, yang mewarisinya dari Lisp. Scala juga memilikinya, saya pikir. Faktanya, hampir setiap implementasi bahasa (compiler atau interpreter) memiliki tabel simbol secara internal, Lisp, Smalltalk dan Ruby hanya memaparkannya kepada programmer.
Jörg W Mittag

1

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.


Saya bisa mengalahkan itu. BCPL memiliki satu tipe data - kata; lihat en.wikipedia.org/wiki/BCPL
Stephen C

Ada berbagai jenis angka (COMP, COMP-1, COMP-2, COMP-3).
David Thornley

Kedengarannya mengerikan. Bisakah Anda menguraikan apa arti detail itu?
Mark C

S= ditandatangani, 9(5)= 5 digit, V= titik desimal implisit, 99= 2 digit lebih banyak, COMP-3= BCD + tanda nybble.
dan04

1

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.


0

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.


0

Clojure menarik karena memiliki meta-konsep "abstraksi" yang meliputi bahasa. Contoh:

  • Koleksi
  • Urutan (malas dan tidak malas)
  • Fungsi Pesanan Tinggi
  • Metode multimetode
  • Protokol
  • Referensi yang dikelola
  • Makro
  • berbagai lainnya .....

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


0

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.


0

Googles Go memiliki tipe "Saluran" yang cukup unik.


1
Saluran tidak unik. Banyak bahasa memilikinya. Felix memilikinya 10 tahun sebelum Google ada :) Ocaml memilikinya 10 tahun sebelum Felix ada.
Yttrill

Dan setidaknya ada satu bahasa lain yang memiliki saluran sebelum Ocaml ada. Masih salah satu jenis yang paling sedikit tersedia dalam bahasa pemrograman.
Brainlag
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.