Programlama dillerinde ilginç veya benzersiz türler? [kapalı]


20

Hepimiz tamsayı, kayan nokta, dize ve ara sıra ondalık türü gördük. Karşılaştığınız, yararlı veya yararlı olmayan en garip veya benzersiz veya kullanışlı türlerden bazıları nelerdir?


Merhaba user10008, Programcılar hoş geldiniz.SE! SSS bölümümüzü kontrol ettiniz mi? Hangisi altı sübjektif kurallar size soru karşılar düşünüyorsunuz?

4
Herkes Lisp için giriş yazmak ister misiniz?
Mark C

Bunun bir dupe olabileceğini düşündüm, ama sadece cevabım bir dupe olabileceğinden, bir link göndereceğim ve belki de bazı iyi cevaplar bulacaksınız: programmers.stackexchange.com/questions/724/…
Peter Turner

@ Mark: Denedim, ancak türler muhtemelen Lisp ile ilgili en az ilginç şeylerden biri.
Larry Coleman

@LarryC Bu listelerin yaygın kullanımı nedeniyle Lisp için mükemmel bir soru olduğunu düşündüm ! Listeler sözdizimi ağacını oluşturur ve bu, kodunuza inanılmaz şeyler yapan işlevler yazmanıza izin verir, topladım. Şimdi Racket'i (daha önce PLT Şeması ) öğreniyorum . Lisp, gerçekten motive olduğum ve öğrenmek istediğim tek programlama dilidir.
Mark C

Yanıtlar:


18

Kısa olacağım:

Maybe a

Haskell Şehrindeki oteller.

Bu basit yapı ile dil, çökme sorununu çözer veya NullPointerExceptionTony Hoare'nin "Bir Milyon Hata" nı düzgün bir şekilde kaldırır :)

Açıkçası, isteğe bağlı bir varlık derleme zamanında kontrol edildi? Rüya gibi ...


1
Ya da diğer birçok programlama dilinde çağrılan Seçenek .
Jonas

@Jonas: İsmi sevmediğimi itiraf etmeliyim Option. Neden olmasın Optional! Çünkü ben anadili konuşmuyordum, fakat Optionbana "isteğe bağlı" anlamı aktarmıyor.
Matthieu M.Eylül

MaybeAdı şirin: "Ne var?" "Belki bir Int". Bununla birlikte, gerçekten temiz olan bit, hem bir işlev hem de bir monad olmasıdır. Hiçbir zaman işlevlerin içine veya kodunuzun ortasına boş kontroller koymanıza gerek yoktur; kodunuzun sonuna kadar kontrol etmeniz yeterlidir.
Tikhon Jelvis


15

Daima sevdim void *. Muhtemelen içimde derinden kusurlu bir şeyin belirtisi.


2
Evet. Korkarım ki tam olarak budur. :) Oh, "benzersiz" yerine "ilginç" için +1. Objective-C açıkçası void *ve Pascal / Delphi var Pointer.
Frank Shearar

haha olmayan bir türü daha, ama güçlü olmadığını iddia edemez
user10008

15
Sadece ifade ettiği doğal karamsarlığı seviyorum: 'O şeyi orada görebiliyor musun?' 'Evet, ne oldu?', 'Fikrim yok.'
biziclop

Her zaman bir boşluk ilan edememenin komik olduğunu düşündüm ama adresini alabilirsin. Bana öyle geliyor ki struct s {int A; boşluk B; int C; } B'nin adresi A ve C arasındaki çatlakın adresi olmalıdır. Ama hayır, izin verilmiyor.
Andy Canfield

Bu yüzden pascal "pointer" genel bir işaretçiyi göstermek için kullanılır ve "prosedür" ile karıştırılmamalıdır.
umlcat

14

Lua , en etkileyici olan yerleşik bir masaya sahiptir. Yerleşik bir hashtable ve bir vektöre sahiptir ve metatabilleri kullanarak prosedürel bir dilde nesne yönelimli programlama için temel temel olabilir.

Bir tablonun her bir dizini temel dil yapılarından herhangi birini alabilir (sayı, boole, dize, işlev -yes, işlevler lua- ve tablolardaki türlerdir).


Javascript'in çok benzer bir şekilde nasıl oluşturulduğunu ve Python'un muhtemelen Ruby ile aynı temel üzerine inşa edildiğini unutmayın.
9000

Bunun Perl ve PHP'de de mümkün olduğunu düşünüyorum, değil mi?
SinirliWithFormsDesigner

Lua'daki tablolar ve diğer dillerde hash kapları arasında bir fark vardır. Lua'nın tablolarını neredeyse büyülü bir şekilde çalışmasını sağlayan karma değerlerini dağıtma biçiminde ince bir uygulama farkı vardır. Çoğunlukla python'da program yapıyorum ve bazen tabloların lua'da çalışma şeklinden beklentilerime dayanarak, tutmayan varsayımlar kullandığımı fark ediyorum. Bu büyünün kendine özgü bir örneği, tamsayıların kendilerine + 1 ayırmasıdır. Bu, tamsayı anahtarlarının yoğun bir şekilde paketlendiği ve +0.0 ve -0.0'ın aynı karmaya sahip oldukları (eşittir)
SingleNegationElimination

9

Henüz kimsenin Monads veya Cebirsel Veri Tiplerinden bahsetmediğine şaşırdım.


Bize örnek gösterebilir :)
nawfal

8

Lisp'in iki ilginç türü vardır: tve nil. Onlar hakkında ilginç olan her şeyin bir tşey olması ve hiçbir şeyin bir olmamasıdır nil.


Ciddi misin? Bunu bilmiyordum.
Mark C

nilbir t?
Jon Harrop


6

Fortran'ın ortak blokları var; modern dillerdeki en az yaygın veri türlerinden biridir veya verileri verimli bir şekilde paylaşmanın alışılmadık bir yoludur.

Fortran 95 aralık tiplerine ve yerleşik aralık aritmetiğine sahiptir.

Haskell'de bulunan monadik türler olmadan liste tam olmaz . Onları anlamak için biraz çabaya ihtiyacın var.


Ah, UniData / UniVerse DB'lerin kendi iç dillerinde (UniBasic) de ortak blokları vardır.
Dan McGrath

Ortak bir blok, programın farklı bölümleri tarafından kullanılan bir kod bloğu mu?
Mark C

1
@MarkC IIRC temelde küresel verilerini, ancak erişen her fonksiyon açıkça üstte olacağını söylemek gerekir
jk.

5

Delphi'nin diğer dillerde de uygulandığına inanmıyorum ( ayrıca bkz. ) Setleri vardır .

Bu, çok değişkenli özniteliklerin veritabanlarında depolanmasını kolaylaştırır: D



3

PL / SQL tip değişkenleri bildirmenize izin verir my_table.some_column%type... Bunu oldukça faydalı buluyorum.

Ve C #, bir tür olarak sayıldığından emin olmadığım halde, nesneleri nullable veya null olarak bildirmenize izin verir.


4
Ancak cursor%rowtypedaha komik: imlecin sorgusunun hangi sütunları döndürdüğünü yansıtan dinamik olarak oluşturulmuş bir kayıt türüdür.
9000

.NET "Nullable" aslında kendi içinde (genel) bir tiptir.
Konamiman

3

Gençken Euphoria'nın veri türleri için kalbimde yumuşak bir nokta vardı

Bu şekilde yapılandırılmıştır:

Object
-> Atom
-> Sequence
  • Atom = Tek bir sayısal değer
  • Sıra = Nesnelerin sırası

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

    Bakınız: Ref Kılavuzu

Not: "jon" aslında ASCII değerlerinin sırasını yazmanın kısa bir yoludur. Örneğin "ABCDEFG", aynı{65, 66, 67, 68, 69, 70, 71}


7
Bu LISP benzeri hissediyor ...
FrustratedWithFormsDesigner

Gerçek veri türleri tek bittir.
Dan McGrath

1
P:!. Aynı @FrustratedWithForms, ben Hey dedi," 'Atom' (a) Lisp gibi ama gereksiz bölücüler ile bu görünüm düşündük
Mark C

3

Felix isimsiz toplam türleri içeriyor. Tür şöyle yazılır:

typedef il = int + long;

teoride olduğu gibi. Değerler çirkin:

case 0 of il (1)
case 1 of il (2L)

belki gibi bir birim toplamı hariç 3 = 1 + 1 + 1

case 0 of 3
case 1 of 3 

maalesef "C uyumluluğu" için sıfır orijinli sayım kullanır. Yapısal olarak yazılmış cebirsel türler için anonim toplamlar gereklidir, örneğin:

(1 + T * li) as li

(tek başına bağlantılı) bir T listesidir. Gerekli nominal olarak yazılan toplamları bildiğim diğer tüm diller, hem türün kendisi hem de yapıcılara ad verilmelidir.

Yukarıda kullanılan stenografi 3 sevimli, aşağıdakiler kütüphanede:

typedef void = 0;
typedef unit = 1;
typedef bool = 2;

ve bu gösterim:

 T ^ 3

statik uzunluk 3 dizisidir. 3 tamsayı değil toplam 3 birimdir. Yazık + ilişkisel değil :)


2

q / kdb + ' da yerleşik tablolar vardır. Bir programlama dili ve sütun odaklı bir veritabanı olduğundan, LINQ veya ORM'lere gerek yoktur.

Örneğin, böyle bir tablo oluşturabilir (atama çoğu dilde :olduğu =gibi değil tarafından ayırt edilir ):

people:([]name:`Joe`Amy`Sarah; age:17 15 18; GPA:3.5 3.8 3.33)

Şimdi masama bakabilirim:

q)show people
name  age GPA 
--------------
Joe   17  3.5 
Amy   15  3.8 
Sarah 18  3.33

Ve ben sorgulayabilirsiniz:

q)select from people where GPA>3.4
name age GPA
------------
Joe  17  3.5
Amy  15  3.8

2

Sendikaların C ++ 'da ilk duyduğumda tuhaf olduğunu gördüm. Hala açık bir seçim olduğu bir senaryoyu vurmadım.


3
Sendikalar C'den geldi. İyi bir örnek php'deki zval yapısıdır.
Martin Wickman

2
Onları bir Z80 emülatöründe kullandım, 16 bit kayıtlara tam kayıtlar (HL, BC) ve 8 bit kayıtlar (H, L, B ve C) olarak kolayca erişebiliyorum. Bu, Z80 asm'de nasıl kullanıldığını yansıtır. Ayrıca "varyantlar", farklı türlerde bir değer tutabilir bir sınıf (örneğin int / float) - neden alt sınıfları kullanmadığından emin değilim, ama o zaman mantıklı :)
ggambett

@ggambett: Z80 programlarım için de aynısını yaptım! Sadece ben de F kayıttaki tek tek bayraklara erişmek için bir bitfield ekledim.
Konamiman

2

Hala çok parametre işlevi F # ve diğer işlevsel dillerde ne olur etrafında kafamı sarmaya çalışıyorum. Temelde int f (Foo, Bar) olur fonk f (Foo)

Bu, bir Foo ve bir Bar ve int döndüren iki parametre fonksiyonudur. Ama bir şekilde isterseniz iki parametre ile arayabilirsiniz. Bu konuda bir yazı yazdı Burada


8
Aksine, bir işlev f(Foo, Bar), döndürülecek değeri f(Foo)döndüren başka bir işlevi döndüren işlevle aynıdır . Yani, 'Foo' argümanını düzeltir, ancak 'Bar' değil. Bu işlevsel diller için tipiktir; buna 'köri' denir. f'(Bar)f(Foo, Bar)
9000

2

Düzenli ifadeler:

Son derece güçlü ancak kompakt nesnelerdir.
Onları yerleşik diller, metin manipüle etmek için büyük bir yeteneğe sahiptir (o kadar iyi değil kelime ayrıştırma duymak sağlar).


2
Regexes ile birçok basit dilbilgisi ayrıştırmak tamamen mümkündür. Örneğin, bir inge dosyasını bir dizi normal ifadenin üstünde minimum mantıkla ayrıştırmak nispeten önemsizdir. Bir çok insanın yaptığı hata, onunla çok karmaşık gramerleri (XML / HTML) ayrıştırmaya çalışmaktır.
Matthew Scharley


@ Mark C: En üstteki cevap (rekor 4320 oy kırıyor). Yapamazsınız
Martin York

Evet, bu mizah içindi. Matthew'in yorumunu okuduğumda aklıma geldi.
Mark C

2

İşlevsel ailede bir avuç dilin Birlik olarak bilinen bir tür sınıfı vardır. Unity tiplerinin ayırt edici özelliği, hiçbir bilgi içermemeleri, sıfır bit tipleridir. Birlik türü (bazı varyasyonlarda) da tek değeridir veya (diğerlerinin çoğunda) yalnızca bir değere sahiptir (kendisi bir tür değildir).

Ancak bunlar faydalıdır, çünkü ayırt edici türlerdir. Bir birlik türünden diğerine dolaylı olarak dönüştüremediğiniz için, statik tür denetimini çok verimli ve etkileyici bir şekilde çalıştırabilirsiniz.

Birlik yeni bir tür diğer türleri, tanımlanmış bir dizi herhangi biri, ya da tanımlamak için izin vererek, aynı zamanda en gibi diller Numaralamalar tarif şekilde belki de (diyelim ki bir tamsayı), tipik bir türde bir değer de olabilir türleri, değerler , veya değeri olmayan bir değere sahip olabilir.

Kullanıcı tanımlı birlik türlerinin zenginliğini kullanmayan bazı dillerin içlerinde bir şekilde veya başka bir şekilde birlik vardır. Örneğin, Python en az üç birlik tipleri vardır, NoneType, NotImplementedType, ve EllipsisType. İlk ikisinin "değer yok" gibi bir şey ifade etmesi ilginçtir, ancak üçüncüsü ilginç özel durumları temsil etmek için karmaşık değerlerde (özellikle dilim ifadelerinde) kullanılır.

Birliğin diğer ilginç örnekleri NULLarasında sql ve undefinedjavascript bulunur, ancak voidC veya C ++ içinde yoktur. voidbaşarısız olur. Bilgi içermeyen bir değeri tanımlasa da, gerçek bir değer tür olamaz void.


Bence "birim tipi" demek istedin.
Jason Baker

2

Ruby'nin symboltipi biraz sıra dışı. Aslında singleton desenini uygulayan bir dize. Ya da başka birşey. Şimdiye kadar, semboller için en iyi kullanım durumlarını izleme durumlarında ve işlev adlarını geçmekte buldum.


Ayrıca O (1) tuş karşılaştırması için bir haritaya anahtarlar olarak.
Jeremy Heiler

Aslında bu o kadar da sıra dışı değil. Ruby onu Lisp'ten devralmış olan Smalltalk'tan miras aldı. Sanırım Scala da var. Aslında, hemen hemen her dil uygulamasının (derleyici veya yorumlayıcı) dahili olarak bir sembol tablosu vardır, Lisp, Smalltalk ve Ruby bunu sadece programcıya maruz bırakır.
Jörg W Mittag

1

COBOL. Temelde yalnızca iki temel veri türü, dizeler ve sayılar vardır, ancak bunların tam olarak nasıl bellekte düzenlendiğini belirtmeniz gerekir , örn PIC S9(5)V99 COMP-3.


Bunu yenebilirim. BCPL'nin bir veri türü vardır - kelime; bkz. en.wikipedia.org/wiki/BCPL
Stephen C

Farklı sayı türleri vardır (COMP, COMP-1, COMP-2, COMP-3).
David Thornley

Kulağa korkunç geliyor. Bu ayrıntıların ne anlama geldiğini açıklayabilir misiniz?
Mark C

S= imzalı, 9(5)= 5 basamak, V= kapalı ondalık basamak, 99= 2 basamak daha, COMP-3= BCD + işareti nybble.
dan04

1

Clipper'ın anonim yöntemlere benzeyen 'Kod Blokları' vardı. Etrafta dolaşılabilir ve gerektiğinde, genellikle bir geri arama biçimi olarak değerlendirilebilirler. Veri tablolarını sunarken bunları anında hesaplamalar yapmak gibi şeyler için kullanırsınız.


0

VHDL'nin fiziksel tipleri vardır. Bu tür bir değişmez değer hem bir değer hem de bir birim içerir. Alt birimleri de tanımlayabilirsiniz. Örneğin, önceden tanımlanmış bir fiziksel tür 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;

Operatör aşırı yüklenmesi ile birlikte çok ilginç şeyler tanımlayabilirsiniz.


0

Clojure ilginçtir çünkü dili tutan bir "soyutlama" meta kavramına sahiptir. Örnekler:

  • Koleksiyonları
  • Diziler (tembel ve tembel olmayan)
  • Yüksek Mertebeden Fonksiyonlar
  • Multimethods
  • Protokoller
  • Yönetilen referanslar
  • Makrolar
  • çeşitli diğerleri .....

Bir dereceye kadar, soyutlamalar " tek sorumluluk ilkesini " aşırıya çıkarır. İstediğiniz işlevselliği elde etmek için onları oluşturmak size kalmıştır, ancak bunları nasıl yapıştırdığınız konusunda son derece esnek olabilirsiniz.

Örneğin, kalıtımla sınıf tabanlı bir OOP sistemi istiyorsanız, bu temel soyutlamalardan birini nispeten hızlı bir şekilde oluşturabilirsiniz.

Pratikte, soyutlamaların kendileri, örneğin sekanslar için clojure.lang.ISeq veya daha yüksek dereceli fonksiyonlar için clojure.lang.IFn gibi belirli arayüzler aracılığıyla çoklu uygulamaların mümkün olacağı şekilde tasarlanmıştır.

Bu konuyla ilgili ilginç bir video var: Soyutlama Sanatı


0

Benzersiz tipte bir dil istiyorsanız BCPL'ye gidin . Bu dilin yalnızca tek bir veri türü vardır; sözcük, dil uygulaması için sabit sayıda bittir.


0

Googles Go, oldukça benzersiz bir "Kanal" türüne sahiptir.


1
Kanallar benzersiz değil. Birçok dilde var. Felix, Google'ın varlığından 10 yıl önce sahipti :) Ocaml, Felix'in varlığından 10 yıl önce sahipti.
Yttrill

Ve Ocaml'ın varlığından önce kanalları olan en az bir dil daha vardı. Hala programlama dillerinde en az kullanılan tiplerden biri.
Brainlag
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.