有没有“null”的语言?

时间:2015-01-23 09:00:15

标签: language-agnostic null language-design

有很多人认为特殊值null的概念(因为它在C,Java,C#,Perl,Javascript,SQL等语言中使用)是一个坏主意。关于SO和P.SE有几个问题,例如Best explanation for languages without nullAre null references really a bad thing?

然而,我找不到任何没有它们的语言。我熟悉的所有语言都有null或类似的东西(例如"未定义"在Perl中)。

我意识到,每种语言都需要某种方式来表达"没有价值"。但是,而不是" null"或者" undefined",这也可以通过使用Maybe(Haskell)或Optional(Guava)之类的东西来明确。拥有" null"的主要区别或"未定义"是一个对象只能有#34;没有价值"如果它有特定的类型(可能,可选......)。相反," null" /" undefined"通常是每个类型的有效值。

是否有任何语言没有" null"或者在这个意义上的类似概念?

3 个答案:

答案 0 :(得分:27)

这是一个不完整的语言列表,在您描述的意义上没有null / undefined / nothing,根据维基百科首次出现的年份排序。

  • C#8将有nullable reference types
  • 的Prolog。逻辑变量代表"任何东西"。没有" null"的概念。或" undefined"。
  • Pony(1.0.0之前)。使用其中一种类型为None的联合类型。
  • Crystal(在alpha阶段):是否有nil,但在编译时阻止所有空指针异常。
  • Kotlin(2015):具有?语法的可选类型。
  • Swift(2014):具有?语法的可选类型。
  • Hack(2014):具有?语法的可选类型。
  • TypeScript(2012):联合类型可以undefinednull作为变体。
  • 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)

随意补充清单。

答案 1 :(得分:2)

Tcl没有任何null的概念。一切都是值,所有值都有一个字符串表示(通常概括为“Everything is a String”)。

最接近null的是空字符串。

传达“无价值”的概念需要一些创造力。

当然,如上所述,有些人使用空字符串来表示没有价值。为此,空字符串在您正在处理的数据集中无效。令人惊讶的是,很多现实世界的数据属于这一类。

指示缺少值的另一种方法是简单地抛出错误。在某些情况下,这应该是应该做的,而不是返回一些null或错误值(从C学习的反模式和难以摆脱的习惯)。

另一种方法是返回一个空列表(列表是Tcl相当于其他语言的数组)。空列表的字符串表示形式是空字符串。但幸运的是,包含空字符串的列表的字符串表示形式是两个双引号:"\"\""。这种差异允许人们区分包含“无”的列表和包含其中没有字符的字符串的列表。

最后,有些人只是简单地指出缺少值而不是声明变量(或者解开它,这是tcl中的一个东西)。这可能听起来很奇怪,因为变量似乎是一个编译时构造(虽然值是运行时构造)但在tcl中一切都是运行时。因此,代码可以使用不存在的变量作为信号。尝试读取未声明的变量会导致您可以捕获的错误。此外,Tcl还允许您使用内省来检查解释器的状态。因此,您可以使用[info exist x]检查名为x的变量是否存在。

答案 2 :(得分:1)

您已经提到Haskell作为没有“null”的语言的示例。 ML系列中还有标准ML,OCaml或F#等语言。许多动态类型语言也没有空指针,方案就是一个很好的例子。