栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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进行比较(不过请注意,不是注释
    null
    本身,定义明确);
  • 被零除;
  • 越界例外;
  • 无限循环等

您只是没有能力很轻松地将一个底部替换为另一个底部,并且Java编译器并没有为底部值做很多推理。但是,存在这些值。

综上所述,

  • null
    在Java中取消引用值是一个特定的表达式,在Java中产生一个底值;
  • undefined
    Haskell中的值是一个通用的底部收益表达式,可以在Haskell中需要底部值的任何地方使用。

那就是他们的相似之处。

后记

关于

null
自身的问题:为什么它被认为是不良形式?

  • 首先,Java
    null
    本质上等效于 向 Haskell中的
    Maybe a
    每个类型添加隐式
    a
  • null
    仅在以下
    Just
    情况下,解引用等效于模式匹配:
    f (Just a) = ... a ...

因此,当传入的值是

Nothing
(在Haskell中)或
null
(在Java中)时,您的程序将达到未定义状态。这很糟糕:程序崩溃。

因此,通过添加

null
每种 类型中,您已经使
bottom
偶然创建值变得更加容易-
类型不再对您有帮助。您的语言已不再帮助您防止这种特定类型的错误,这很糟糕。

当然,其他最低值仍然存在:异常(如

undefined
)或无限循环。向每个函数添加新的可能的故障模式-
取消引用
null
-只会使编写崩溃程序变得更加容易。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/455565.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号