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 – 只是使编写崩溃的程序更容易。

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

  1. java Null==undefined_javascript中的undefined和null有什么区别

    原标题:javascript中的undefined和null有什么区别 java中的undefined和null的区别有:类型不同前者返回的是未定义值后者是对象:转换原始类型方式不同前者是不支持转换后 ...

  2. Javascript 中的非空判断 undefined,null, NaN的区别

    JS 数据类型 在介绍这三个之间的差别之前, 先来看一下JS  的数据类型. 在 Java ,C这样的语言中, 使用一个变量之前,需要先定义这个变量并指定它的数据类型,是整型,字符串型,.... 但是 ...

  3. java 获取动态的service_【Android】动态代理在 Retrofit 中的使用

    首先,什么是动态代理和为什么会有动态代理. 众所周知,Java 是一门静态语言,编写完的类,无法在运行时做动态修改. 一个简单的动态代理如下: 1.先定义一个接口,想要使用动态代理,必须先定义一个接口 ...

  4. java list 截取部分数据_Java List.subList()方法:获取列表中指定范围的子列表

    集合类中的 List.subList() 方法用于获取列表中指定范围的子列表,该列表支持原列表所支持的所有可选操作.返回列表中指定范围的子列表. 语法: subList(int fromIndex,i ...

  5. java中可用于定义成员常量_13秋北航《Java语言与面向对象程序设计》在线作业三辅导 …...

    需要答案的请联系:qq或者微信 514169068 一. 惟一选项(共 15 道试题,共 60 分.)V 1.设有定义 float x=3.5f, y=4.6f, z=5.7f:则以下的表白式中,值为 ...

  6. java多态 降低代码耦合性_深度分析:理解Java中的多态机制,一篇直接帮你掌握!...

    Java中的多态 1 多态是什么 多态(Polymorphism)按字面的意思就是"多种状态".在面向对象语言中,接口的多种不同的实现方式即为多态.用白话来说,就是多个对象调用同一 ...

  7. java代码如何与界面联系在一起_如何在Visual Studio Code 中编写Java代码

    本文将展示如何在Visual Studio Code中用Java编写和运行一个简单的Hello World程序. 首先您必须在本地开发环境中安装Java SE开发工具包(JDK) Visual Stu ...

  8. 聚合中返回source_Java 8 中的 Streams API 详解—— Streams 的背景以及 Java 8 中的使用详解...

    为什么需要 Stream Stream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念.它也不同于 StAX 对 ...

  9. java异常在哪一层捕获_当在一个方法的代码中抛出一个检测异常时,该异常或被方法中的 ( )结构 捕获,或者在方法的 ( ) 中声明_学小易找答案...

    [填空题]当异常已经被定义时,必须通过( ) 语句来处理它. [填空题]Catch 子句包含( )的程序段 [单选题]下列java语言的常用异常类中,属于检测异常的是() [单选题]自定义异常类时,可 ...

  10. Java基础提升篇:理解String 及 String.intern() 在实际中的应用

    点击上方"好好学java",选择"置顶公众号" 优秀学习资源.干货第一时间送达! 好好学java java知识分享/学习资源免费分享 关注 精彩内容 你所需要的 ...

最新文章

  1. pytorch常用代码
  2. php time 毫秒_PHP获取当前时间的毫秒数
  3. 大剑无锋之已知后续遍历bfegcda,中序badefcg,前序是?【面试推荐】
  4. 怎么解决python Non-ASCII character错误
  5. data studio_面向营销人员的Data Studio —报表指南
  6. Python 常用函数 - Python入门教程
  7. 关于Markdown编辑器怎么写“|”等特殊符号的问题
  8. ios上input框上边有阴影
  9. 一步一步配置DataGuard Broker
  10. cocos creator粒子不变色_隐秘的物理粒子系统与渲染 !Cocos Creator LiquidFun !
  11. 李彦宏发布内部信:宣布升级百度“云+AI”战略
  12. ELK学习总结(1)——我们为什么要用ELK
  13. 父游标、子游标及共享游标
  14. 超详细 excel 基础知识
  15. f-droid_使用F-Droid在Android上开源
  16. Vue 插件开发与发布
  17. k8s执行init时出现 Initial timeout of 40s passed
  18. android系统目录和作用是什么意思,安卓Android手机系统内文件夹目录解释
  19. 脾胃不好,有哪些在家可以做的暖胃汤方?
  20. 代码扫描 | 把控代码质量的利器

热门文章

  1. 2019年美国大学生数学建模注意事项(摘https://www.comap.com/undergraduate/contests/)(重点:论文提交方式)
  2. 多系统启动菜单的修复EasyBoot
  3. easyboot-code-generate 自动生成代码
  4. 观点|蚂蚁金服玉伯:我们是如何从前端技术进化到体验科技的?
  5. 微软推出Azure Sphere漏洞奖励计划,最高奖金10万美元
  6. ssd测试软件寿命查看,铅锤哥:怎么看SSD还能用多久?固态硬盘寿命的检测方法...
  7. 杆刚度校核c语言程序,第12章杆件的强度、刚度计算.doc
  8. 中首清算:“股神”很闹心,巴菲特曾割肉的航空股竟连续领涨?
  9. java的reader_Java Reader类
  10. MTK MT6577 Android驱动设置方法资料分享