整数、浮動小数点、文字列、および時折10進型を見てきました。あなたが遭遇した最も奇妙な、ユニークな、または有用なタイプのいくつかは、有用であるかどうか?
整数、浮動小数点、文字列、および時折10進型を見てきました。あなたが遭遇した最も奇妙な、ユニークな、または有用なタイプのいくつかは、有用であるかどうか?
回答:
私は短くなります:
Maybe a
ハスケルで。
この単純な構造により、言語はクラッシュの問題を解決するかNullPointerException
、トニー・ホアの「百万の間違い」をきれいに回避します:)
率直に言って、オプションの存在はコンパイル時にチェックされますか?夢のような...
Option
名前が嫌いだと認めざるを得ない。どうしてOptional
!私はネイティブスピーカーでOption
はないが、「オプション」の意味を伝えていないためかもしれません。
Maybe
名前はかわいいです:「あなたは何がありますか?」「多分int」。しかし、本当にすてきなことは、ファンクターとモナドの両方であり、簡単に言えば、ヌル伝搬が無料であることを意味します。関数内やコードの途中にnullチェックを配置する必要はありません。コードの最後でチェックする必要があるだけです。
Maybe
Ruby用モナドは:lostechies.com/derickbailey/2010/10/10/the-maybe-monad-in-ruby
私はずっと好きですvoid *
。それはおそらく私に深く欠陥がある何かの症状です。
void *
、Pascal / DelphiにはありPointer
ます。
Luaには最も印象的な組み込みテーブルがあります。ハッシュテーブルとベクターが組み込まれており、メタテーブルを使用することで、手続き型言語でのオブジェクト指向プログラミングの基本的な基盤になります。
テーブルの各インデックスは、任意の基本的な言語構造(数値、ブール、文字列、関数-yes、関数はlua-の型、およびテーブル)を受け取ることができます。
SNOBOL:パターン(正しく覚えていれば、本質的にLL(1)パーサーツリー)。
Fortranには共通のブロックがあります。これは、現代言語で最も一般的なデータ型の1つであり、データを効率的に共有するための珍しい方法です。
Fortran 95には、間隔タイプと組み込みの間隔演算があります。
Haskellで見つかったモナド型がないと、リストは完全にはなりません。それらを理解するには、少し努力が必要です。
若かった頃、Euphoriaのデータ型の心にソフトスポットがあった
次のように構成されています。
Object
-> Atom
-> Sequence
シーケンス=オブジェクトのシーケンス
-- 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
参照:参照マニュアル
注:「jon」は、実際にはASCII値のシーケンスを記述する簡単な方法です。たとえば"ABCDEFG"
、次と同じです{65, 66, 67, 68, 69, 70, 71}
Felixには匿名の合計タイプがあります。タイプは次のように記述されます。
typedef il = int + long;
理論的にはそうです。値はいです:
case 0 of il (1)
case 1 of il (2L)
たぶん次のような単位和を除いて 3 = 1 + 1 + 1
case 0 of 3
case 1 of 3
残念ながら、「C互換性」にゼロ原点カウントを使用しています。構造的に型付けされた代数型には、たとえば次のような匿名の合計が必要です。
(1 + T * li) as li
Tの(単一リンクの)リストです。必要な名義型の合計を知っている他のすべての言語では、型自体とコンストラクターの両方に名前を付ける必要があります。
上記で使用されている速記3はかわいいです、以下はライブラリにあります:
typedef void = 0;
typedef unit = 1;
typedef bool = 2;
そしてこの表記法:
T ^ 3
静的な長さ3の配列です。3は整数ではなく、3ユニットの合計です。残念なのは連想的ではありません:)
q / kdb +にはテーブルが組み込まれています。プログラミング言語と列指向のデータベースが1つになっているため、LINQやORMは必要ありません。
たとえば、次のようなテーブルを作成できます(ほとんどの言語:
ではなく、割り当てによって区別され=
ます)。
people:([]name:`Joe`Amy`Sarah; age:17 15 18; GPA:3.5 3.8 3.33)
これでテーブルを見ることができます:
q)show people
name age GPA
--------------
Joe 17 3.5
Amy 15 3.8
Sarah 18 3.33
そして、私はそれを照会することができます:
q)select from people where GPA>3.4
name age GPA
------------
Joe 17 3.5
Amy 15 3.8
私が最初にそれらについて聞いたとき、私はC ++の共用体が「風変わりな」ものであることがわかりました。実装するのに明らかな選択肢であるシナリオにはまだヒットしていません。
私はまだ、F#やその他の関数型言語でマルチパラメーター関数がどうなるかについて頭を悩ませようとしています。基本的に int f(Foo、Bar) は func f(Foo)になります
それは、Fooを取り、Barを取り、intを返す2つのパラメーター関数です。実際には、Fooを取り、barを取り、intを返す1つのパラメーター関数を返します。ただし、必要に応じて2つのパラメーターで呼び出すことができます。私はそれについてここに投稿しました
f(Foo, Bar)
は、返される値f(Foo)
を返す別の関数f'(Bar)
を返す関数と同じf(Foo, Bar)
です。つまり、「Foo」引数を修正し、「Bar」を修正しない場合、「Foo」に依存しないが、「Bar」引数に依存する関数があります。これは関数型言語の典型です。「カレー」と呼ばれます。
非常に強力でコンパクトなオブジェクトです。
それらが組み込まれている言語は、テキストを操作する優れた能力を持っています(単語の解析が聞こえないように、それらはあまり良くありません)。
機能ファミリの少数の言語には、Unityと呼ばれる種類のクラスがあります。Unityタイプの際立った機能は、情報が含まれていないこと、ゼロビットタイプであることです。ユニティタイプは(一部のバリエーションでは)その唯一の値でもあり、(ほとんどの場合)単一の値しかありません(それ自体はタイプではありません)。
ただし、これらは識別タイプであるため便利です。あるユニティ型から別のユニティ型に暗黙的に変換することはできないため、静的型チェックを非常に効率的で表現力豊かに機能させることができます。
Unityはまた、方法、ほとんどそのような言語は、新しいタイプの他のタイプの定義されたセットのいずれかとすることができるようにすることで、列挙型を記述する、または記述することであるかもしれない典型的なタイプ(例えば、整数)の値のいずれかであり得るタイプ、値、または値なしを表す値があります。
ユーザー定義の統一タイプの豊富さを採用していない言語の中には、何らかの形で統一されたものがあります。例えば、Pythonは、少なくとも三つの統一タイプがありNoneType
、NotImplementedType
とEllipsisType
。最初の2つは両方とも「値なし」のようなものを意味しますが、3つ目は複雑な値(具体的にはスライス式)で使用され、興味深い特別なケースを表します。
ユニティの他の興味深い例としてはNULL
、sqlやundefined
javascriptがありますがvoid
、CやC ++ではありません。 void
失敗します。それは情報のない値を記述しますが、実際の値はtypeにはなりませんvoid
。
Rubyのsymbol
型は少し珍しいです。基本的には、シングルトンパターンを実装する文字列です。か何か。これまでのところ、シンボルの最適な使用法は、状態の追跡と関数名の受け渡しにあります。
COBOL。基本的に2つの基本的なデータ型、文字列と数字のみですが、メモリ内での配置方法を正確に指定する必要がありますPIC S9(5)V99 COMP-3
。
S
=符号付き、9(5)
= 5桁、V
=暗黙の小数点、99
=さらに2桁、COMP-3
= BCD +符号ニブル。
VHDLには物理タイプがあります。そのようなタイプのリテラルには、値と単位の両方が含まれます。サブユニットも定義できます。たとえば、定義済みの物理タイプは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;
演算子のオーバーロードとともに、非常に興味深いものを定義できます。
Clojureは、言語に浸透する「抽象化」のメタ概念を持っているため、興味深いものです。例:
ある程度まで、抽象化は「単一の責任原則」を極端に取ります。必要な機能を得るためにそれらを構成するのはあなた次第ですが、それらをどのように接着するかについては非常に柔軟にできます。
たとえば、継承を備えたクラスベースのOOPシステムが必要な場合、これらのコア抽象化から比較的迅速に構築できます。
実際には、抽象化自体は、たとえばシーケンスの場合はclojure.lang.ISeq、高階関数の場合はclojure.lang.IFnなどの特定のインターフェイスを介して、複数の実装が可能な方法で設計されています。
このトピックに関する興味深いビデオがあります:抽象化の芸術
ユニークなタイプの言語が必要な場合は、BCPLに進んでください。この言語には、言語実装の固定ビット数であるワードという1つのデータ型しかありません。