プログラミング言語で興味深いまたはユニークなタイプ?[閉まっている]


20

整数、浮動小数点、文字列、および時折10進型を見てきました。あなたが遭遇した最も奇妙な、ユニークな、または有用なタイプのいくつかは、有用であるかどうか?


こんにちはuser10008、Programmers.SEへようこそ!FAQをチェックアウトしましたか?6つの主観的なガイドラインのうち、あなたの質問に合うと思うものはどれですか?

4
Lispのエントリを書きたい人はいますか?
マークC

私はそれがだまされやすい人だったかもしれないと思ったが、私はリンクを投稿しますので、私の答えは、だまされやすい人だったでしょうし、多分あなたは、いくつかの良い答えを見つけるだろうという理由だけで:programmers.stackexchange.com/questions/724/...を
ピーターターナー

@Mark:試しましたが、タイプはおそらくLispに関して最も面白くないものの1つです。
ラリーコールマン

@LarryC リストが広く使われているので、これはLispにとって完璧な質問だと思いました!リストは構文ツリーを形成し、これにより、コードに対して驚くべきことを行う関数を作成できます。私は今、ラケット(以前はPLTスキーム)を学んでいます。Lispは、私が真に動機付けられ、学びたいと思っている唯一のプログラミング言語です。
マークC

回答:


18

私は短くなります:

Maybe a

ハスケルで。

この単純な構造により、言語はクラッシュの問題を解決するかNullPointerException、トニー・ホアの「百万の間違い」をきれいに回避します:)

率直に言って、オプションの存在はコンパイル時にチェックされますか?夢のような...


1
または、他の多くのプログラミング言語で呼び出されるOption
ジョナス

@ジョナス:Option名前が嫌いだと認めざるを得ない。どうしてOptional!私はネイティブスピーカーでOptionはないが、「オプション」の意味を伝えていないためかもしれません。
マチューM.

Maybe名前はかわいいです:「あなたは何がありますか?」「多分int」。しかし、本当にすてきなことは、ファンクターとモナドの両方であり、簡単に言えば、ヌル伝搬が無料であることを意味します。関数内やコードの途中にnullチェックを配置する必要はありません。コードの最後でチェックする必要があるだけです。
ティコンジェルビス


15

私はずっと好きですvoid *。それはおそらく私に深く欠陥がある何かの症状です。


2
はい。それがまさにそれだと思う。:)ああ、「ユニーク」ではなく「面白い」ために+1。Objective-Cには明らかにありvoid *、Pascal / DelphiにはありPointerます。
フランクシェラー

ハハはもっとタイプではありませんが、パワフルではないと主張することはできません
user10008

15
私は、それが表現する固有の悲観主義が大好きです:「あそこにあるものを見ることができますか?」「はい、それは何ですか?」、「わかりません。」
biziclop

空虚を宣言することはできないが、その住所を取得することができるのはおかしいといつも思っていました。struct s {int A; ボイドB; int C; } BのアドレスはAとCの間のクラックのアドレスである必要があります。しかし、許可されていません。
アンディキャンフィールド

そのため、パスカルでは「ポインター」を使用して汎用ポインターを示し、「手順」と混同しないようにしています。
umlcat

14

Luaには最も印象的な組み込みテーブルがあります。ハッシュテーブルとベクターが組み込まれており、メタテーブルを使用することで、手続き型言語でのオブジェクト指向プログラミングの基本的な基盤になります。

テーブルの各インデックスは、任意の基本的な言語構造(数値、ブール、文字列、関数-yes、関数はlua-の型、およびテーブル)を受け取ることができます。


Javascriptが非常によく似た方法で構築されており、PythonもおそらくRubyと同じ基盤の上に構築されていることに注意してください。
9000

これはPerlとPHPでも可能だと思いますか?
FrustratedWithFormsDesigner

luaのテーブルと他の言語のハッシュコンテナーには違いがあります。luaがハッシュ値を配布する方法には、わずかな実装上の違いがあります。これにより、ほとんど魔法のような方法でテーブルが機能します。私は主にpythonでプログラミングしますが、ときどきluaでのテーブルの動作方法に対する期待に基づいて、保持できない仮定を使用していることがわかります。この魔法の特定の例は、整数が自身にハッシュ+ 1することです。これは、整数キーが密にパックされ、+ 0.0と-0.0が同じハッシュを持つことを意味します(等しい)
SingleNegationElimination




6

Fortranには共通のブロックがあります。これは、現代言語で最も一般的なデータ型の1つであり、データを効率的に共有するための珍しい方法です。

Fortran 95には、間隔タイプと組み込みの間隔演算があります。

Haskellで見つかったモナド型がないと、リストは完全にはなりません。それらを理解するには、少し努力が必要です。


ああ、UniData / UniVerse DBには、内部言語(UniBasic)の共通ブロックもあります。
ダン・マクグラス

共通ブロックは、プログラムのさまざまな部分で使用されるコードのブロックですか?
マークC

1
@MarkC IIRCその基本的にグローバルデータが、アクセスする各機能は、明示的にそれが一番上にしようとしていると言うことがある
JK。

5

Delphiにはセット(を参照)がありますが、他の言語でも同じ方法で実装されているとは思いません。

これにより、データベースに多変数属性を簡単に保存できます:D


4

古典的なアーキテクチャのプログラミングから来るのは本当に奇妙なことだと思いますが、確かに最初に頭を悩ませるのが最も難しいタイプの1つはQCLに現れる量子レジスターでした。


3

PL / SQLを使用すると、型の変数を宣言できますmy_table.some_column%type...かなり便利です。

また、C#を使用すると、オブジェクトがNULL可能かどうかを宣言できますが、それが型としてカウントされるかどうかはわかりません。


4
しかしcursor%rowtypeでも笑えるです:それは列カーソルのクエリリターンを反映し、動的に形成されたレコードタイプです。
9000

.NET "Nullable"は、実際には(ジェネリック)タイプです。
コナミマン

3

若かった頃、Euphoriaのデータ型の心にソフトスポットがあった

次のように構成されています。

Object
-> Atom
-> Sequence
  • Atom =単一の数値
  • シーケンス=オブジェクトのシーケンス

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


7
これはLISPのように感じます
...-FrustratedWithFormsDesigner

実際のデータ型が唯一のビットです。
ダン・マクグラス

1
@FrustratedWithForms同じように、「ねえ、彼は「Atom」と言った!これは(a)Lispのようだが、不必要な仕切りがある。:P
マークC

3

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ユニットの合計です。残念なのは連想的ではありません:)


2

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

2

私が最初にそれらについて聞いたとき、私はC ++の共用体が「風変わりな」ものであることがわかりました。実装するのに明らかな選択肢であるシナリオにはまだヒットしていません。


3
UnionsはCから来ました。1つの良い例は、phpのzval構造体です。
マーティンウィックマン

2
これらをZ80エミュレーターで使用して、16ビットレジスター全体のレジスター(HL、BC)および8ビットレジスター(H、L、B、C)に簡単にアクセスしました。これは、Z80 asmでの使用方法を反映しています。また、「バリアント」では、さまざまなタイプの値(int / floatなど)を保持できるクラス-サブクラスを使用しなかった理由は
わかり

@ggambett:Z80プログラムでもまったく同じことをしました!Fレジスタの個々のフラグにアクセスするためのビットフィールドも追加しました。
コナミマン

2

私はまだ、F#やその他の関数型言語でマルチパラメーター関数がどうなるかについて頭を悩ませようとしています。基本的に int f(Foo、Bar)func f(Foo)になります

それは、Fooを取り、Barを取り、intを返す2つのパラメーター関数です。実際には、Fooを取り、barを取り、intを返す1つのパラメーター関数を返します。ただし、必要に応じて2つのパラメーターで呼び出すことができます。私はそれについてここに投稿しまし


8
むしろ、関数f(Foo, Bar)は、返される値f(Foo)を返す別の関数f'(Bar)を返す関数と同じf(Foo, Bar)です。つまり、「Foo」引数を修正し、「Bar」を修正しない場合、「Foo」に依存しないが、「Bar」引数に依存する関数があります。これは関数型言語の典型です。「カレー」と呼ばれます。
9000

2

正規表現:

非常に強力でコンパクトなオブジェクトです。
それらが組み込まれている言語は、テキストを操作する優れた能力を持っています(単語の解析が聞こえないように、それらはあまり良くありません)。


2
多くの単純な文法を正規表現で解析することは完全に可能です。たとえば、一連の正規表現の上に最小限のロジックを持つiniファイルを解析するのは比較的簡単です。多くの人が犯す間違いは、非常に複雑な文法(つまり、XML / HTML)を解析しようとすることです。
マシューシャーリー


@Mark C:一番の答えは(最高記録で4320票を獲得)です。できません
マーティンヨーク

はい、それはユーモアのためでした。マシューのコメントを読んだとき、それは思い浮かびました。
マークC

2

機能ファミリの少数の言語には、Unityと呼ばれる種類のクラスがあります。Unityタイプの際立った機能は、情報が含まれていないこと、ゼロビットタイプであることです。ユニティタイプは(一部のバリエーションでは)その唯一の値でもあり、(ほとんどの場合)単一の値しかありません(それ自体はタイプではありません)。

ただし、これらは識別タイプであるため便利です。あるユニティ型から別のユニティ型に暗黙的に変換することはできないため、静的型チェックを非常に効率的で表現力豊かに機能させることができます。

Unityはまた、方法、ほとんどそのような言語は、新しいタイプの他のタイプの定義されたセットのいずれかとすることができるようにすることで、列挙型を記述する、または記述することであるかもしれない典型的なタイプ(例えば、整数)の値のいずれかであり得るタイプ、値、または値なしを表す値があります。

ユーザー定義の統一タイプの豊富さを採用していない言語の中には、何らかの形で統一されたものがあります。例えば、Pythonは、少なくとも三つの統一タイプがありNoneTypeNotImplementedTypeEllipsisType。最初の2つは両方とも「値なし」のようなものを意味しますが、3つ目は複雑な値(具体的にはスライス式)で使用され、興味深い特別なケースを表します。

ユニティの他の興味深い例としてはNULL、sqlやundefinedjavascriptがありますがvoid、CやC ++ではありません。 void失敗します。それは情報のない値を記述しますが、実際の値はtypeにはなりませんvoid


あなたは「ユニットタイプ」を意味すると思います。
ジェイソンベイカー

2

Rubyのsymbol型は少し珍しいです。基本的には、シングルトンパターンを実装する文字列です。か何か。これまでのところ、シンボルの最適な使用法は、状態の追跡と関数名の受け渡しにあります。


O(1)キー比較用のマップへのキーとしても。
ジェレミーハイラー

まあ、それは本当に珍しいことではありません。RubyはSmalltalkから継承し、SmalltalkはLispから継承しました。Scalaにもあると思います。実際、ほとんどすべての言語実装(コンパイラーまたはインタープリター)には内部的にシンボルテーブルがあり、Lisp、Smalltalk、Rubyはそれをプログラマーに公開するだけです。
ヨルグWミットタグ

1

COBOL。基本的に2つの基本的なデータ型、文字列と数字のみですが、メモリ内での配置方法を正確に指定する必要がありますPIC S9(5)V99 COMP-3


私はそれを打ち負かすことができます。BCPLには1つのデータ型があります-単語。参照en.wikipedia.org/wiki/BCPL
スティーブンC

さまざまなタイプの番号があります(COMP、COMP-1、COMP-2、COMP-3)。
デビッドソーンリー

ひどいですね。これらの詳細の意味について詳しく説明していただけますか?
マークC

S=符号付き、9(5)= 5桁、V=暗黙の小数点、99=さらに2桁、COMP-3= BCD +符号ニブル。
dan04

1

Clipperには「コードブロック」があり、匿名メソッドに似ていました。それらは必要に応じて、通常はコールバックの形式として渡され、評価されます。多くの場合、データのテーブルを提示する際にその場で計算を実行するなどの目的で使用します。


0

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;

演算子のオーバーロードとともに、非常に興味深いものを定義できます。


0

Clojureは、言語に浸透する「抽象化」のメタ概念を持っているため、興味深いものです。例:

  • コレクション
  • シーケンス(遅延および非遅延)
  • 高階関数
  • マルチメソッド
  • プロトコル
  • 管理された参照
  • マクロ
  • 他のさまざまな.....

ある程度まで、抽象化は「単一の責任原則」を極端に取ります。必要な機能を得るためにそれらを構成するのはあなた次第ですが、それらをどのように接着するかについては非常に柔軟にできます。

たとえば、継承を備えたクラスベースのOOPシステムが必要な場合、これらのコア抽象化から比較的迅速に構築できます。

実際には、抽象化自体は、たとえばシーケンスの場合はclojure.lang.ISeq、高階関数の場合はclojure.lang.IFnなどの特定のインターフェイスを介して、複数の実装が可能な方法で設計されています。

このトピックに関する興味深いビデオがあります:抽象化の芸術



0

Googles Goには、非常にユニークな「チャンネル」タイプがあります。


1
チャンネルは一意ではありません。多くの言語にそれらがあります。FelixはGoogleが存在する10年前にそれらを持ちました:) OcamlはFelixが存在する10年前にそれらを持ちました。
イットリル

そして、Ocamlが存在する前にチャンネルを持っていた少なくとも1つの他の言語がありました。プログラミング言語でまだ利用できないタイプの1つです。
ブレインラグ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.