Wir haben alle Integer, Floating Point, String und den gelegentlichen Dezimaltyp gesehen. Was sind einige der merkwürdigsten oder einzigartigsten oder nützlichsten Typen, die Ihnen begegnet sind, nützlich oder nicht?
Wir haben alle Integer, Floating Point, String und den gelegentlichen Dezimaltyp gesehen. Was sind einige der merkwürdigsten oder einzigartigsten oder nützlichsten Typen, die Ihnen begegnet sind, nützlich oder nicht?
Antworten:
Ich werde kurz sein:
Maybe a
in Haskell.
Mit diesem einfachen Konstrukt löst die Sprache das Problem der Abstürze oder NullPointerException
umgeht den "One Million Mistake" von Tony Hoare :)
Ehrlich gesagt, eine optionale Präsenz zur Kompilierungszeit überprüft? Es ist traumhaft ...
Option
Name nicht gefällt . Warum nicht Optional
! Es kann sein, dass ich kein Muttersprachler bin Option
, mir aber nicht die "optionale" Bedeutung vermittelt.
Maybe
Name ist süß: "Was hast du?" "Vielleicht ein Int". Das wirklich nette daran ist jedoch, dass es sowohl ein Funktor als auch eine Monade ist, was im Klartext bedeutet, dass Sie die Null-Propagierung kostenlos erhalten. Sie müssen niemals Null-Checks in Funktionen oder in die Mitte Ihres Codes setzen. Sie müssen es, wenn überhaupt, immer nur ganz am Ende Ihres Codes überprüfen.
Maybe
Monade für Ruby: lostechies.com/derickbailey/2010/10/10/the-maybe-monad-in-ruby
Ich bin immer gern void *
. Es ist wahrscheinlich ein Symptom für etwas, das tief in mir steckt.
void *
und Pascal / Delphi haben Pointer
.
Lua hat einen eingebauten Tisch , der am eindrucksvollsten ist. Es verfügt über eine eingebaute Hashtabelle und einen Vektor und kann bei Verwendung von Metatabellen die grundlegende Basis für die objektorientierte Programmierung in einer prozeduralen Sprache sein.
Jeder Index einer Tabelle kann eine der grundlegenden Sprachstrukturen erhalten (Zahl, Boolescher Wert, Zeichenfolge, Funktion - Ja, Funktionen sind Typen in lua - und Tabellen).
Lisp hat zwei interessante Typen: t
und nil
. Das Interessante an ihnen ist, dass alles a t
und nichts a ist nil
.
nil
ein t
?
SNOBOL: Muster (im Wesentlichen ein LL (1) -Parserbaum, wenn ich mich richtig erinnere).
Fortran hat gemeinsame Blöcke; Dies ist einer der am seltensten vorkommenden Datentypen in modernen Sprachen oder eher eine ungewöhnliche Art, Daten effizient auszutauschen.
Fortran 95 verfügt über Intervalltypen und integrierte Intervallarithmetik.
Ohne die in Haskell vorkommenden monadischen Typen wäre die Liste nicht vollständig . Um sie zu verstehen, muss man sich ein wenig anstrengen.
Delphi hat Mengen ( siehe auch ), von denen ich glaube, dass sie in anderen Sprachen nicht auf die gleiche Weise implementiert sind.
Dadurch wird das Speichern von Attributen mit mehreren Variablen in Datenbanken zum Kinderspiel: D
Ich nehme an, es ist wirklich nur seltsam, auf einer klassischen Architektur zu programmieren, aber sicherlich war einer der schwierigsten Typen für mich, meinen Kopf zuerst herumzureißen, das Quantenregister , das in QCL auftaucht .
Mit PL / SQL können Sie Variablen vom Typ deklarieren my_table.some_column%type
... Das finde ich verdammt nützlich.
Mit C # können Sie Objekte als nullbar oder nicht deklarieren, obwohl ich nicht sicher bin, ob dies als Typ gilt.
cursor%rowtype
ist noch lustiger: Es handelt sich um einen dynamisch geformten Datensatztyp, der angibt, welche Spalten die Cursorabfrage zurückgibt.
Als ich jünger war, hatte ich ein Faible für Euphorias Datentypen
Es ist wie folgt aufgebaut:
Object
-> Atom
-> Sequence
Sequenz = Eine Sequenz von Objekten
-- 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
Siehe: Das Referenzhandbuch
Hinweis: "jon" ist eigentlich eine Kurzform zum Schreiben der Folge von ASCII-Werten. Zum Beispiel "ABCDEFG"
ist das gleiche wie{65, 66, 67, 68, 69, 70, 71}
Felix hat anonyme Summentypen. Der Typ ist wie folgt geschrieben:
typedef il = int + long;
wie es theoretisch sein würde. Die Werte sind hässlich:
case 0 of il (1)
case 1 of il (2L)
außer vielleicht für eine Einheitssumme wie 3 = 1 + 1 + 1
case 0 of 3
case 1 of 3
die unglücklicherweise die Nullursprungszählung für "C-Kompatibilität" verwendet. Anonyme Summen sind für strukturell typisierte algebraische Typen erforderlich, zum Beispiel:
(1 + T * li) as li
ist eine (einfach verknüpfte) Liste von T. Alle anderen Sprachen, die ich kenne, benötigen nominell typisierte Summen, wobei sowohl der Typ selbst als auch die Konstruktoren benannt werden müssen.
Die oben verwendete Kurzschrift 3 ist niedlich, die folgende befindet sich in der Bibliothek:
typedef void = 0;
typedef unit = 1;
typedef bool = 2;
und diese Notation:
T ^ 3
ist ein Array der statischen Länge 3. Die 3 ist keine ganze Zahl, sondern eine Summe von 3 Einheiten. Wie schade + ist nicht assoziativ :)
In q / kdb + sind Tabellen integriert. Da es sich um eine Programmiersprache und eine spaltenorientierte Datenbank handelt, sind weder LINQ noch ORMs erforderlich.
Zum Beispiel kann eine Tabelle wie diese erstellt werden (die Zuweisung unterscheidet sich :
eher =
von der in den meisten Sprachen):
people:([]name:`Joe`Amy`Sarah; age:17 15 18; GPA:3.5 3.8 3.33)
Jetzt kann ich auf meinen Tisch schauen:
q)show people
name age GPA
--------------
Joe 17 3.5
Amy 15 3.8
Sarah 18 3.33
Und ich kann es abfragen:
q)select from people where GPA>3.4
name age GPA
------------
Joe 17 3.5
Amy 15 3.8
Ich fand Gewerkschaften in C ++ 'schrullig', als ich zum ersten Mal von ihnen hörte. Ich habe noch kein Szenario getroffen, in dem sie die naheliegende Wahl für die Implementierung sind.
Ich versuche immer noch, mir Gedanken darüber zu machen, was aus einer Multiparameter-Funktion in F # und anderen funktionalen Sprachen wird. Grundsätzlich int f (Foo, Bar) wird func f (Foo)
Dies ist die Zwei-Parameter-Funktion, die ein Foo und einen Takt und ein int zurückgibt. Dies ist eine Ein-Parameter-Funktion, die ein Foo und eine Ein-Parameter-Funktion zurückgibt, die einen Takt und ein int zurückgibt. Aber irgendwie kann man es mit zwei Parametern aufrufen, wenn man will. Ich habe hier einen Beitrag darüber geschrieben
f(Foo, Bar)
dieselbe wie eine Funktion f(Foo)
, die eine andere Funktion f'(Bar)
zurückgibt, die den Wert zurückgibt, der zurückgegeben werden f(Foo, Bar)
würde. Das heißt, wenn Sie das Argument 'Foo' korrigieren, aber nicht 'Bar', haben Sie eine Funktion, die nicht von 'Foo' abhängt, aber immer noch vom Argument 'Bar' abhängt. Dies ist typisch für funktionale Sprachen. es heißt "currying".
Sie sind extrem leistungsfähige und dennoch kompakte Objekte.
Sprachen, in denen sie eingebaut sind, können Text sehr gut manipulieren (lassen Sie uns das Wort nicht hören, wenn sie nicht so gut sind).
Eine Handvoll Sprachen in der funktionalen Familie haben eine Klasse von Typen, die als Einheit bekannt sind. Das Unterscheidungsmerkmal von Unity-Typen besteht darin, dass sie keine Informationen enthalten und Null-Bit-Typen sind. Ein Einheitstyp (in einigen Variationen) ist auch sein einziger Wert oder (in den meisten anderen) hat nur einen Wert (der selbst kein Typ ist).
Diese sind jedoch nützlich, da es sich um unterschiedliche Typen handelt. Da Sie nicht implizit von einem Einheitstyp in einen anderen konvertieren können, können Sie die statische Typprüfung sehr effizient und aussagekräftig einsetzen.
Einheit ist auch die Art und Weise, wie solche Sprachen Enums beschreiben, indem sie einem neuen Typ erlauben, eine definierte Menge anderer Typen zu sein, oder vielleicht Typen zu beschreiben , Werte, die entweder ein Wert eines typischen Typs sein können (z. B. eine Ganzzahl). oder einen Wert haben, der keinen Wert darstellt.
Einige Sprachen, die nicht den Reichtum an benutzerdefinierten Einheitstypen verwenden, enthalten in der einen oder anderen Form immer noch eine Einheit. Zum Beispiel Python hat mindestens drei Einheitstypen NoneType
, NotImplementedType
und EllipsisType
. Es ist interessant, dass die ersten beiden Werte so etwas wie "Kein Wert" bedeuten, aber der dritte Wert wird in komplexen Werten (insbesondere in Slice-Ausdrücken) verwendet, um interessante Sonderfälle darzustellen.
Weitere interessante Beispiele für Unity sind NULL
SQL und undefined
Javascript, jedoch nicht void
C oder C ++. void
scheitert. Obwohl es einen Wert ohne Information beschreibt, kann kein tatsächlicher Wert vom Typ sein void
.
Rubys symbol
Typ ist etwas ungewöhnlich. Es ist im Wesentlichen eine Zeichenfolge, die das Singleton-Muster implementiert. Oder so. Bisher habe ich festgestellt, dass Symbole am besten in Verfolgungszuständen und beim Übergeben von Funktionsnamen verwendet werden.
COBOL. Im Wesentlichen nur zwei grundlegende Datentypen, Zeichenfolgen und Zahlen, aber Sie müssen genau angeben , wie sie im Speicher angeordnet sind, z PIC S9(5)V99 COMP-3
.
S
= Vorzeichen , 9(5)
= 5 Ziffern, V
= impliziter Dezimalpunkt, 99
= 2 weitere Ziffern, COMP-3
= BCD + Vorzeichen-Nybble.
Clipper hatte 'Codeblöcke', die anonymen Methoden ähnelten. Sie können bei Bedarf weitergegeben und ausgewertet werden, normalerweise als Rückruf. Sie werden häufig verwendet, um beispielsweise Berechnungen während der Präsentation von Datentabellen durchzuführen.
VHDL hat physikalische Typen. Ein solches Literal enthält sowohl einen Wert als auch eine Einheit. Sie können auch Untereinheiten definieren. Ein vordefinierter physikalischer Typ ist beispielsweise 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;
Zusammen mit der Überladung von Operatoren können Sie sehr interessante Dinge definieren.
Clojure ist interessant, weil es ein Meta-Konzept von "Abstraktionen" hat, die die Sprache durchziehen. Beispiele:
In gewisser Weise heben die Abstraktionen das Prinzip der " Einzelverantwortung " auf das Äußerste. Es liegt an Ihnen, sie zusammenzustellen, um die gewünschte Funktionalität zu erhalten, aber Sie können äußerst flexibel sein, wie Sie sie zusammenkleben.
Wenn Sie beispielsweise ein klassenbasiertes OOP-System mit Vererbung möchten, können Sie relativ schnell eine dieser Kernabstraktionen erstellen.
In der Praxis sind die Abstraktionen selbst so konzipiert, dass mehrere Implementierungen möglich sind, z. B. über bestimmte Schnittstellen wie clojure.lang.ISeq für Sequenzen oder clojure.lang.IFn für Funktionen höherer Ordnung.
Zu diesem Thema gibt es ein interessantes Video: Die Kunst der Abstraktion
Googles Go hat einen "Channel" -Typ, der ziemlich einzigartig ist.