两者都是其类型是所有类型(无人居住)的交集的术语。两者都可以在代码中传递,而不会失败,直到尝试对其进行评估。我能看到的唯一区别是,在Java中,存在一个漏洞,可以null
对一个操作进行精确的评估,即引用相等比较(==
),而在Haskell
undefined
中,如果不抛出异常就无法进行评估。这是唯一的区别吗?
我真正想解决的问题是,为什么null
在Java 中包含如此明显的错误决定,Haskell如何逃避呢?在我看来,真正的问题是,你可以做一些 有用的
带null
,即你可以检查它的 NULL的含量
。因为您可以执行此操作,所以在代码中传递空值并使其指示“无结果”而不是“此程序中存在逻辑错误”已成为标准惯例。而在Haskell中,无法检查一个术语是否在没有评估且程序爆炸的情况下达到最低值,因此永远不能将其用于表示“无结果”。相反,人们被迫使用Maybe
。
抱歉,如果我对“评价”一词玩得太紧了……我想在此处进行类比,而很难准确地表述它。我想这表明类推是不精确的。
Haskell中的undefined和Java中的null有什么区别?
好吧,让我们备份一下。
Haskell中的“未定义”是“底”值(表示为⊥)的示例。这样的值表示程序中任何未定义,卡住或部分状态。
存在许多不同形式的底部:非终止循环,异常,模式匹配失败-基本上是程序中某种程度上未定义的状态。该值undefined :: a
是将程序置于未定义状态的值的典型示例。
undefined
本身并不是特别特殊-它没有连接-
您可以undefined
使用任何底线表达式来实现Haskell的。例如,这是有效的实现undefined
:
> undefined = undefined
或立即退出(旧的Gofer编译器使用此定义):
> undefined | False = undefined
bottom的主要属性是,如果表达式的计算结果为bottom,则整个程序的计算结果将为bottom:该程序处于未定义状态。
为什么要这样的价值?好吧,用一种惰性语言,您通常可以操纵存储最低值的结构或函数,而无需使程序本身成为最低值。
例如,无限循环列表是非常复杂的:
> let xs = [ let f = f in f
, let g n = g (n+1) in g 0
]
> :t xs
xs :: [t]
> length xs
2
我只是不能对列表中的元素做很多事情:
> head xs
^CInterrupted.
这种对无限内容的操纵是为什么Haskell如此有趣且富有表现力的原因之一。懒惰的结果是,Haskell特别重视bottom
价值观。
但是,很明显,底部的概念同样适用于Java或任何(非全部)语言。在Java中,有许多表达式可以产生“底”值:
null
本身,定义明确);您只是没有能力很轻松地将一个底部替换为另一个底部,并且Java编译器并没有为底部值做很多推理。但是,存在这些值。
综上所述,
null
在Java中取消引用值是一个特定的表达式,在Java中产生一个底值;undefined
Haskell中的值是一个通用的底部收益表达式,可以在Haskell中需要底部值的任何地方使用。那就是他们的相似之处。
后记
关于null
自身的问题:为什么它被认为是不良形式?
null
本质上等效于 向 Haskell中的Maybe a
每个类型添加隐式a
。null
仅在以下Just
情况下,解引用等效于模式匹配:f (Just a) = ... a ...
因此,当传入的值是Nothing
(在Haskell中)或null
(在Java中)时,您的程序将达到未定义状态。这很糟糕:程序崩溃。
因此,通过添加null
到 每种 类型中,您已经使bottom
偶然创建值变得更加容易-
类型不再对您有帮助。您的语言已不再帮助您防止这种特定类型的错误,这很糟糕。
当然,其他最低值仍然存在:异常(如undefined
)或无限循环。向每个函数添加新的可能的故障模式-
取消引用null
-只会使编写崩溃程序变得更加容易。
问题内容: 我想知道JavaScript 和之间的区别。 问题答案: 在JavaScript中,表示变量已被声明但尚未分配值,例如: 是分配值。可以将其分配给变量,以表示没有值: 从前面的示例中可以明显看出,和是两个不同的类型:是类型本身(未定义),而是对象。 和
问题内容: 为什么在JavaScript中被视为? 正在检查 与…相同 ? 并且: 和之间有什么区别? 问题答案: (name is undefined) You: What is name? () JavaScript:* ?什么啊 我不知道你在说什么您以前从未提到过。您是否在(客户端)看到其他脚本语言? You: What is name? JavaScript: I don’t know.。
本文向大家介绍JavaScript中的null和undefined区别介绍,包括了JavaScript中的null和undefined区别介绍的使用技巧和注意事项,需要的朋友参考一下 JavaScript中存在2个代表信息不存在的特殊值:null和undefined。个人认为可以从以下角度来理解这两个特殊值之间的区别: 1.null代表有存储信息的容器(比如之前被赋过值的变量),但该容器中的内容为
问题内容: 我一直认为Java 中的运算符用于验证其两个布尔操作数是否均为,并且该&运算符用于对两种整数类型进行按位运算。 最近我知道,也可以使用运算符来验证其两个布尔操作数是否均为,唯一的区别是即使LHS操作数为false,它也会检查RHS操作数。 Java中的运算符是否在内部重载?还是在这背后有其他概念? 问题答案: <-验证两个操作数 <-停止评估第一个操作数是否为false,因为结果为fa
本文向大家介绍js中的undefined和 ReferenceError: xxx is not defined 有什么区别?相关面试题,主要包含被问及js中的undefined和 ReferenceError: xxx is not defined 有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 是变量申明未赋值的初始值 是为声明变量的报错信息
本文向大家介绍在js中undefined和not defined的区别是什么?相关面试题,主要包含被问及在js中undefined和not defined的区别是什么?时的应答技巧和注意事项,需要的朋友参考一下 1.undefined 已经声明,但未赋值 2.not defined 未声明,报错