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?
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?
Yanıtlar:
Kısa olacağım:
Maybe a
Haskell Şehrindeki oteller.
Bu basit yapı ile dil, çökme sorununu çözer veya NullPointerException
Tony 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 ...
Option
. Neden olmasın Optional
! Çünkü ben anadili konuşmuyordum, fakat Option
bana "isteğe bağlı" anlamı aktarmıyor.
Maybe
Adı ş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.
Maybe
Ruby için bir monad var : lostechies.com/derickbailey/2010/10/10/the-maybe-monad-in-ruby
Daima sevdim void *
. Muhtemelen içimde derinden kusurlu bir şeyin belirtisi.
void *
ve Pascal / Delphi var Pointer
.
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).
Henüz kimsenin Monads veya Cebirsel Veri Tiplerinden bahsetmediğine şaşırdım.
Lisp'in iki ilginç türü vardır: t
ve nil
. Onlar hakkında ilginç olan her şeyin bir t
şey olması ve hiçbir şeyin bir olmamasıdır nil
.
nil
bir t
?
SNOBOL: desen (doğru hatırlıyorsam aslında bir LL (1) ayrıştırıcı ağacı).
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.
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
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.
cursor%rowtype
daha komik: imlecin sorgusunun hangi sütunları döndürdüğünü yansıtan dinamik olarak oluşturulmuş bir kayıt türüdür.
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
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}
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 :)
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
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.
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
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)
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).
İş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 NULL
arasında sql ve undefined
javascript bulunur, ancak void
C veya C ++ içinde yoktur. void
başarısız olur. Bilgi içermeyen bir değeri tanımlasa da, gerçek bir değer tür olamaz void
.
Ruby'nin symbol
tipi 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.
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
.
S
= imzalı, 9(5)
= 5 basamak, V
= kapalı ondalık basamak, 99
= 2 basamak daha, COMP-3
= BCD + işareti nybble.
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.
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.
Clojure ilginçtir çünkü dili tutan bir "soyutlama" meta kavramına sahiptir. Örnekler:
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ı
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.
Googles Go, oldukça benzersiz bir "Kanal" türüne sahiptir.