web-dev-qa-db-ja.com

「null」のない言語はありますか?

特別な値null(C、Java、C#、Perl、Javascript、SQLなどの言語で使用される)の概念は悪い考えだと考える人はたくさんいます。 SOおよびP.SEには、 nullのない言語の最良の説明 および null参照は本当に悪いことですか?)など、いくつかの質問があります。

しかし、私はそれらなしで機能する言語を見つけることができませんでした。私が精通しているすべての言語には、null、または同様のものがあります(たとえば、Perlでは「未定義」)。

おそらくすべての言語が「価値の欠如」を表現するための何らかの方法を必要としていることを私は理解しています。ただし、「null」または「undefined」の代わりに、 Maybe (Haskell)または Optionalのようなものを使用して明示的にすることもできます。 (グアバ)。 「null」または「undefined」を持つこととの主な違いは、オブジェクトが特定のタイプ(多分、オプション...)を持っている場合にのみ、オブジェクトが「値なし」を持つことができるということです。対照的に、「null」/「undefined」は通常、everyタイプで可能な有効な値です。

この意味で「null」または同様の概念を持たない言語はありますか?

19
sleske

これは、ウィキペディアによると、最初に登場した年順に並べられた、あなたが説明した意味でのnull/undefined/nothingのない言語の不完全なリストです。

  • C#8には null許容参照型 があります。
  • プロローグ。論理変数は「すべて」を表します。 「null」または「undefined」の概念はありません。
  • ポニー (1.0.0より前)。タイプの1つがNoneである共用体タイプを使用します。
  • Crystal (アルファ段階):nilがありますが、コンパイル時にすべてのnullポインター例外を防ぎます。
  • Kotlin (2015):?構文のオプションタイプがあります。
  • Swift (2014):?構文のオプションタイプがあります。
  • Hack (2014):?構文のオプションタイプがあります。
  • TypeScript (2012):バリアントとしてundefinedまたはnullを持つことができる共用体タイプがあります。
  • Elm (2012):共用体型はMaybeです。
  • Ceylon (2011):?構文のオプションタイプがあります。
  • Rust (2010):オプションのタイプOptionがあります。
  • Fantom (2005):?構文のオプションタイプがあります。
  • F# (2005):共用体型はOptionです。
  • Nice (2003):?構文のオプションタイプがあります。
  • Netlogo (1999)にはタイプがありませんnull
  • OCaml (1996):共用体型はoptionです。
  • Haskell (1990):共用体型はMaybeです。
  • Standard ML (1990):共用体型はoptionです。
  • Tcl (1988)
  • Erlang (1986)

リストを自由に補完してください。

28
emlai

Tclにはnullの概念はまったくありません。すべてが値であり、すべての値には文字列表現があります(通常は「すべてが文字列です」と要約されます)。

Nullに最も近いのは、空の文字列です。

「価値なし」の概念を伝えるには、ある程度の創造性が必要です。

もちろん、前述のように、値がないことを示すために空の文字列を使用する人もいます。これが機能するためには、処理しているデータセットで空の文字列を有効にすることはできません。驚いたことに、多くの実世界のデータがこのカテゴリに分類されます。

値がないことを示す別の方法は、単にエラーをスローすることです。場合によっては、nullまたはエラー値(Cから学習したアンチパターンと取り除くのが難しい習慣)を返す代わりに、これが正確に行われるべきだったことがあります。

さらに別の方法は、空のリストを返すことです(リストはTclの他の言語の配列に相当します)。空のリストの文字列表現は空の文字列です。しかし、幸いなことに、空の文字列を含むリストの文字列表現は、2つの二重引用符です:"\"\""。この違いにより、「nothing」を含むリストと、文字を含まない文字列を含むリストを区別できます。

最後に、変数を宣言しない(または宣言しない、これはtclにある)ことで、値がないことを示す人もいます。変数はコンパイル時の構成(値は実行時の構成)のように見えますが、tclではすべてが実行時であるため、これは奇妙に聞こえるかもしれません。したがって、コードが変数の非存在をシグナルとして使用する可能性があります。宣言されていない変数を読み取ろうとすると、エラーが発生し、キャッチできます。さらに、Tclでは、イントロスペクションを使用してインタープリターの状態を確認することもできます。したがって、[info exist x]を使用して、xという変数が存在するかどうかを確認できます。

3
slebetman

「null」のない言語の例として、Haskellについてはすでに言及しました。 MLファミリーには、Standard ML、OCaml、F#などの言語もあります。多くの動的に型付けされた言語もnullポインターを備えていないため、スキームが良い例です。

1
svenningsson