有没有“null”的语言?

问题描述 投票:15回答:3

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

但是,我找不到任何没有它们的语言。我熟悉的所有语言都有null或类似的东西(例如Perl中的“undefined”)。

我意识到,每种语言都需要某种方式来表达“缺乏价值”。但是,不是使用“null”或“undefined”,而是使用Maybe(Haskell)或Optional(Guava)之类的东西也可以明确这一点。具有“null”或“undefined”的主要区别在于,如果对象具有特定类型(Maybe,Optional ...),则该对象只能具有“无值”。相反,“null”/“undefined”通常是每种类型可能的有效值。

在这个意义上,是否存在没有“null”或类似概念的语言?

language-agnostic null language-design
3个回答
27
投票

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

  • C#8将有nullable reference types
  • 序言。逻辑变量代表“任何东西”。没有“null”或“undefined”的概念。
  • Pony(1.0.0之前)。使用union类型,其中一种类型是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)

随意补充列表。


2
投票

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

最接近null的是空字符串。

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

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

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

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

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


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.