有没有"null"的语言?

sle*_*ske 17 language-agnostic null language-design

有许多人认为特殊值的概念null(因为它在C,Java,C#,Perl,Javascript,SQL等语言中使用)是一个坏主意.关于SO和P.SE有几个问题,例如没有null的语言的最佳解释空引用真的是一件坏事吗?.

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

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

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

eml*_*lai 28

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

  • C#8将具有可为空的引用类型.
  • 序言.逻辑变量代表"任何东西".没有"null"或"undefined"的概念.
  • 小马(1.0.0之前).使用其中一种类型的联合类型None.
  • Crystal(在alpha阶段):有nil,但在编译时阻止所有空指针异常.
  • Kotlin(2015):具有?语法的可选类型.
  • Swift(2014):具有?语法的可选类型.
  • Hack(2014):具有?语法的可选类型.
  • TypeScript(2012):具有可以具有undefinednull作为变体的联合类型.
  • 榆树(2012):有工会类型Maybe.
  • Ceylon(2011):具有?语法的可选类型.
  • Rust(2010):具有可选类型Option.
  • Fantom(2005):具有?语法的可选类型.
  • F#(2005):有联合类型Option.
  • Nice(2003):具有?语法的可选类型.
  • OCaml(1996):有工会类型null.
  • Haskell(1990):有联合类型option.
  • 标准ML(1990):具有联合类型Maybe.
  • Tcl(1988)

随意补充列表.

  • 我的感受也是如此。例如,dart 一直使用“?”运算符来表达可为 null 的变量。但只有在“2.12”中提供了最新的“空声音安全”支持之后,它才支持静态保证非空值。我认为这种区别更有趣,而且可能问题的真正目的是什么。 (4认同)
  • Kotlin有点牵强。它支持null,但区分可为null和非null类型。但是,它确实具有null的概念 (2认同)
  • 不知何故,我感觉这个答案没有抓住问题的重点。它将“null”的概念等同于选项类型。选项类型对于表示某种情况是必要的。当考虑“null”时,我更多地考虑基本上每个变量都可能为 null 的语言。 (2认同)