Wszyscy widzieliśmy liczbę całkowitą, zmiennoprzecinkową, łańcuch i okazjonalny typ dziesiętny. Jakie są najbardziej dziwne, unikalne lub przydatne typy, z którymi się spotkałeś, przydatne czy nie?
programming-languages
language-features
type-systems
data-types
użytkownik10008
źródło
źródło
Odpowiedzi:
Będę krótki:
Maybe a
w Haskell.
Dzięki tej prostej konstrukcji język rozwiązuje problem awarii lub
NullPointerException
zgrabnie omija „One Million Mistake” Tony'ego Hoare'a :)Szczerze mówiąc, opcjonalna obecność sprawdzana w czasie kompilacji? To marzenie ...
źródło
Option
imię. Dlaczego nieOptional
! Może dlatego, że nie jestem native speakerem, aleOption
nie przekazuje mi „opcjonalnego” znaczenia.Maybe
Nazwa jest słodkie: „Co masz?” „Może int”. Jednak naprawdę schludne jest to, że jest to zarówno funktor, jak i monada, co, mówiąc prosto, oznacza, że otrzymujesz zerową propagację za darmo. Nigdy nie musisz umieszczać kontroli zerowej w funkcjach lub w środku kodu; wystarczy, że w ogóle to sprawdzisz na samym końcu kodu.Maybe
Dla Ruby jest monada: lostechies.com/derickbailey/2010/10/10/the-maybe-monad-in-rubyOd zawsze lubię
void *
. Prawdopodobnie jest to objaw czegoś głęboko we mnie wadliwego.źródło
void *
i Pascal / DelphiPointer
.Lua ma wbudowany stół, który robi największe wrażenie. Ma wbudowany hashtable i wektor, a przy użyciu metatablów może być podstawową podstawą programowania obiektowego w języku proceduralnym.
Każdy indeks tabeli może odbierać dowolną z podstawowych struktur językowych (liczba, wartość logiczna, ciąg, funkcja-tak, funkcje są typami w lua - i tabele).
źródło
Dziwię się, że nikt jeszcze nie wspomniał o Monadach ani Algebraicznych Typach Danych.
źródło
Lisp ma dwa ciekawe typy:
t
inil
. Interesujące w nich jest to, że wszystko jestt
i nic nie jestnil
.źródło
nil
t
SNOBOL: wzorzec (zasadniczo drzewo analizatora składni LL (1), jeśli dobrze go pamiętam).
źródło
Fortran ma wspólne bloki; jest to jeden z najmniej popularnych typów danych we współczesnych językach lub raczej nietypowy sposób efektywnego udostępniania danych.
Fortran 95 ma typy interwałów i wbudowaną arytmetykę interwałów.
Lista nie byłaby kompletna bez typów monadycznych znalezionych w Haskell. Aby je zrozumieć, potrzebujesz trochę wysiłku.
źródło
Delphi ma zestawy ( patrz także ), które, jak sądzę, nie są implementowane w ten sam sposób w innych językach.
To sprawia, że przechowywanie atrybutów o wielu zmiennych w bazach danych jest dziecinnie proste: D
źródło
Przypuszczam, że to naprawdę dziwne, że pochodzi z programowania na klasycznej architekturze, ale z pewnością jednym z najtrudniejszych rodzajów, dla których na początku zawinąłem głowę, był rejestr kwantowy , który pojawia się w QCL .
źródło
PL / SQL pozwala zadeklarować zmienne typu
my_table.some_column%type
... Uważam, że to cholernie przydatne.A C # pozwala zadeklarować obiekty jako zerowalne lub nie, chociaż nie jestem pewien, czy liczy się to jako typ.
źródło
cursor%rowtype
jest jeszcze zabawniejszy: jest to dynamicznie formowany typ rekordu, który odzwierciedla, które kolumny zwraca zapytanie kursora.Miałem słabość w sercu Euphoria typów danych „s, kiedy byłem młodszy
Ma następującą strukturę:
Sekwencja = Sekwencja obiektów
Zobacz: Podręcznik referencyjny
Uwaga: „jon” jest w rzeczywistości krótkim sposobem na napisanie sekwencji wartości ASCII. Na przykład
"ABCDEFG"
jest taki sam jak{65, 66, 67, 68, 69, 70, 71}
źródło
Felix ma anonimowe typy sum. Typ jest zapisany w następujący sposób:
jak byłoby w teorii. Wartości są brzydkie:
z wyjątkiem być może sumy jednostkowej, takiej jak
3 = 1 + 1 + 1
który niestety wykorzystuje zerowe liczenie początku dla „zgodności C”. Anonimowe sumy są niezbędne dla strukturalnie typowanych typów algebraicznych, na przykład:
jest (pojedynczo połączoną) listą T. Wszystkie inne języki, jakie znam, o wymaganych nominalnie wpisanych sumach, przy czym zarówno sam typ, jak i konstruktory muszą mieć nazwy.
Skrót 3 użyty powyżej jest uroczy, w bibliotece znajduje się:
i ta notacja:
jest tablicą o długości statycznej 3 .. 3 nie jest liczbą całkowitą, ale sumą 3 jednostek. Jaka szkoda + nie kojarzy się :)
źródło
q / kdb + ma wbudowane tabele. Ponieważ jest to język programowania i zorientowana na kolumny baza danych w jednym, nie ma potrzeby korzystania z LINQ ani ORM.
Na przykład można utworzyć tabelę podobną do tej (przypisanie wyróżnia się
:
raczej niż=
w większości języków):Teraz mogę spojrzeć na mój stół:
I mogę zapytać:
źródło
Kiedy po raz pierwszy o nich usłyszałem, związek w C ++ był „dziwaczny”. Nadal nie natrafiłem na scenariusz, w którym są oczywistym wyborem do wdrożenia.
źródło
Wciąż próbuję zawinąć głowę wokół tego, czym staje się funkcja wieloparametrowa w języku F # i innych językach funkcjonalnych. Zasadniczo int f (Foo, Bar) staje się func f (Foo)
Jest to funkcja dwuparametrowa, która pobiera Foo, a Bar i zwraca int jest tak naprawdę funkcją jednoparametrową, która pobiera Foo i zwraca funkcję jednego parametru, która bierze pręt i zwraca int. Ale jakoś możesz to nazwać za pomocą dwóch parametrów, jeśli chcesz. Tutaj napisałem o tym post
źródło
f(Foo, Bar)
jest taka sama jak funkcja,f(Foo)
która zwraca inną funkcję,f'(Bar)
która zwraca wartość, któraf(Foo, Bar)
by zwróciła. Oznacza to, że jeśli naprawisz argument „Foo”, ale nie „Bar”, masz funkcję, która nie zależy od „Foo”, ale nadal zależy od argumentu „Bar”. Jest to typowe dla języków funkcjonalnych; nazywa się to „curry”.Wyrażenia regularne:
Są niezwykle potężnymi, ale kompaktowymi obiektami.
Języki, w których są wbudowane, mają dużą zdolność do manipulowania tekstem (nie słychać parsowania słowa, że nie są tak dobre).
źródło
Kilka języków w rodzinie funkcjonalnej ma klasę typów znanych jako Jedność. Cechą wyróżniającą typy Unity jest to, że nie zawierają żadnych informacji, są to typy zero-bitowe. Typ jedności (w niektórych odmianach) jest również jego jedyną wartością lub (w większości innych) ma tylko jedną wartość (która sama nie jest typem).
Są one jednak przydatne, ponieważ są to typy wyróżnione. Ponieważ nie można niejawnie konwertować z jednego typu jedności na inny, można sprawić, że sprawdzanie typu statycznego będzie działać w bardzo wydajny i ekspresyjny sposób.
Jedność jest także sposobem, w jaki większość takich języków opisuje Enums, pozwalając, aby nowy typ był dowolnym zdefiniowanym zestawem innych typów, lub opisywać może typy, które mogą być albo wartością typowego typu (powiedzmy liczbą całkowitą) lub mieć wartość reprezentującą brak wartości.
Niektóre języki, które nie wykorzystują bogactwa typów jedności zdefiniowanych przez użytkownika, nadal mają w sobie jedność, w takiej czy innej formie. Na przykład, Python ma co najmniej trzy rodzaje jedności
NoneType
,NotImplementedType
orazEllipsisType
. Interesujące jest to, że pierwsze dwa oba oznaczają coś w rodzaju „Brak wartości”, ale trzecia jest używana w wartościach złożonych (w szczególności wyrażeniach plasterków) w celu przedstawienia interesujących przypadków specjalnych.Inne ciekawe przykłady jedności obejmują
NULL
w SQL iundefined
javascript, ale nievoid
w C lub C ++.void
zawodzi. Mimo że opisuje wartość braku informacji, ale żadna rzeczywista wartość nie może być typuvoid
.źródło
symbol
Typ Ruby jest nieco niezwykły. Jest to zasadniczo ciąg implementujący wzorzec singletonu. Lub coś. Jak dotąd znalazłem najlepsze zastosowanie symboli w stanach śledzenia i przekazywaniu nazw funkcji.źródło
COBOL. Zasadniczo tylko dwa podstawowe typy danych, ciągi i liczby, ale musisz dokładnie określić , jak są ułożone w pamięci, np
PIC S9(5)V99 COMP-3
.źródło
S
= podpisany,9(5)
= 5 cyfr,V
= domyślny przecinek dziesiętny,99
= 2 dodatkowe cyfry,COMP-3
= BCD + znak nybble.Clipper miał „Bloki kodu”, które były podobne do metod anonimowych. Można je przekazywać i oceniać w razie potrzeby, zwykle jako formę oddzwaniania. Często używasz ich do wykonywania obliczeń w locie podczas prezentacji tabel danych.
źródło
VHDL ma typy fizyczne. Literał tego typu zawiera zarówno wartość, jak i jednostkę. Możesz również zdefiniować podjednostki. Na przykład predefiniowanym typem fizycznym jest
time
:Wraz z przeciążeniem operatora możesz zdefiniować bardzo interesujące rzeczy.
źródło
Clojure jest interesujący, ponieważ ma meta-koncepcję „abstrakcji”, która przenika język. Przykłady:
W pewnym stopniu abstrakcje doprowadzają do skrajności „ zasadę pojedynczej odpowiedzialności ”. To Ty musisz je skomponować, aby uzyskać pożądaną funkcjonalność, ale możesz być bardzo elastyczny w kwestii tego, jak je sklejasz.
Na przykład, jeśli chcesz oparty na klasach system OOP z dziedziczeniem, możesz stosunkowo szybko zbudować jeden z tych podstawowych abstrakcji.
W praktyce same abstrakcje są zaprojektowane w taki sposób, że możliwe są liczne implementacje, np. Poprzez określone interfejsy, takie jak clojure.lang.ISeq dla sekwencji lub clojure.lang.IFn dla funkcji wyższego rzędu.
Jest ciekawy film na ten temat: The Art of Abstraction
źródło
Jeśli chcesz mieć język unikalnego typu, wybierz BCPL . Ten język ma tylko jeden typ danych, słowo, będące stałą liczbą bitów dla implementacji języka.
źródło
Googles Go ma unikalny typ „kanału”.
źródło