Java中undefined是什么意思,Haskell中的undefined和Java中的null有什么区别?

Haskell中的undefined和Java中的null有什么区别?

好的,让我们稍微回顾一下。

Haskell中的“undefined”是“bottom”值的示例(表示为⊥)。 这样的值表示程序中的任何未定义的,卡住的或部分的状态。

存在许多不同forms的底层:非终止循环,exception,模式匹配失败 – 基本上,程序中的任何状态在某种意义上都是未定义的。 值undefined :: a是将程序置于未定义状态的值的典型示例。

undefined本身不是特别特殊 – 它没有连接 – 你可以使用任何底部产生的expression式来实现Haskell的undefined 。 例如,这是一个undefined的有效实现:

> undefined = undefined

或者立即退出(旧的Gofer编译器使用这个定义):

> undefined | False = undefined

底部的主要属性是,如果expression式评估为最低,则整个程序将评估到最低:程序处于未定义状态。

你为什么要这样的价值? 那么,用一种懒惰的语言,你可以经常操纵那些存储底层值的结构或函数,而程序本身并不是底层的。

例如一个无限循环的列表是完全有力的:

> let xs = [ let f = f in f , let gn = g (n+1) in g 0 ] > :t xs xs :: [t] > length xs 2

我不能用列表中的元素做很多事情:

> head xs ^CInterrupted.

无限的东西的操纵是为什么Haskell如此有趣和performance力的一部分。 Haskell对懒惰的结果是特别关注bottom价值。

但是,显然,底部的概念同样适用于Java或任何(非全部)语言。 在Java中,有许多expression式产生“底部”值:

比较引用与空(虽然注意,不是null本身,这是很好的定义);

被零除;

越界例外;

无限循环等

你只是没有能力很容易地将一个底部replace成另一个底部,而Java编译器对于底部值的理由并没有太多的理由。 但是,这样的价值在那里。

综上所述,

在Java中取消引用null值是一个在Java中产生最低值的特定expression式;

Haskell中的undefined值是一个通用的底部产生式expression式,可以在Haskell需要的底部值的任何地方使用。

这就是他们的相似之处。

后记

至于null本身的问题:为什么它被认为是不好的forms?

首先,Java的null本质上等同于在Haskell中为每个typesa添加隐式Maybe a 。

取消引用null相当于仅用于case的模式匹配: f (Just a) = ... a ...

所以当传入的值是Nothing (在Haskell中)或null (在Java中)时,程序会达到一个未定义的状态。 这是不好的:你的程序崩溃了。

所以,通过为每种types添加null ,您可以轻而易举地创buildbottom值 – 这些types不再有助于您。 你的语言不再帮助你防止那种特殊的错误,那很糟糕。

当然,其他底部值仍然存在:exception( undefined )或无限循环。 为每个函数添加一个新的可能的失败模式 – 解引用null – 只是使编写崩溃的程序更容易。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值