例外情况和参照透明性

大卫·K

阅读“ Scala中的函数式编程”后,我对异常不是参考透明的部分感到有些困惑。

给出的例子是

def failingFn(i: Int): Int = {
  val y: Int = throw new Exception("fail!")
  try {
    val x = 42 + 5
    x + y
  }
  catch { case e: Exception => 43 }
}

因此,书中给出的论点y不是参照透明的,因为如果将其替换为try块中的主体,与直接运行该函数相比,将得到不同的结果。这对我来说没有任何意义,因为整个函数从一开始就没有终止,那么说函数体内的值不具有参照透明性又意味着什么呢?我认为天真的替代方法如下

def failingFn(i: Int): Int = {
  val y: Int = throw new Exception("fail!")
  try {
    val x = 42 + 5
    x + ((throw new Exception("fail!")): Int)
  }
  catch { case e: Exception => 43 }
}

并且仍然失败,但有相同的例外。

此外,y它本身是一个非值(不能直接评估为一个值),那么谈论此类表达式的引用透明性有什么意义呢?我怀疑这里手忙脚乱,所以我的推理到底在哪里不正确?

贾斯汀·皮霍尼(Justin Pihony)

本书指出的是,如果它确实是参照透明的,则可以y完全删除该变量并将其替换为,try/catch从而得到不同的语义。

因此,要指出的是,在例外情况下,评估例外情况很重要。

也许您可以争辩说这两个程序在语义上是不同的,因为评估的位置才是真正重要的。如果选择y lazy,则结果不会改变。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

纯度,参照透明性和状态单价

来自分类Dev

组件,隔离功能和“参照透明性”

来自分类Dev

当Java8使用参照透明性时

来自分类Dev

类型推断会干扰参照透明性

来自分类Dev

如何记录例外情况?

来自分类Dev

建筑挤压的例外情况

来自分类Dev

如何在不依赖公共数据上下文实例的情况下保持相关实体之间的参照透明性?

来自分类Dev

Skrollr背景透明性?

来自分类Dev

例外:无法绑定到目标方法,因为其签名或安全性透明性与委托类型的签名或安全性透明性不兼容

来自分类Dev

例外:无法绑定到目标方法,因为其签名或安全性透明性与委托类型的签名或安全性透明性不兼容

来自分类Dev

例外情况下正确工作

来自分类Dev

OpenGL透明性不透明

来自分类Dev

如何在Scala中跟踪嵌套期货的例外情况和结果

来自分类Dev

如何保证F#应用程序中的参照透明性?

来自分类Dev

CQRS-域例外与例外情况下的事件

来自分类Dev

OpenGL透明性无法正常工作

来自分类Dev

如何超越CSS的透明性方面

来自分类Dev

Gnome终端的背景透明性

来自分类Dev

定义参考透明性和确定性功能之间有什么区别?

来自分类Dev

为引导程序导航栏和照片增加半透明性,并增加字体大小

来自分类Dev

为什么Grails会删除我的例外情况?

来自分类Dev

断路器有太多例外情况?

来自分类Dev

例外情况在Java:如何减少重复的代码

来自分类Dev

如何使用zio-test测试例外情况

来自分类Dev

使用线程池时有哪些例外情况

来自分类Dev

随机“根据验证过程,远程证书无效。” 例外情况

来自分类Dev

在Outlook中,如何确定约会系列的例外情况?

来自分类Dev

防止在例外情况下显示DLL源

来自分类Dev

在证书名称中使用 IP 地址的例外情况

Related 相关文章

  1. 1

    纯度,参照透明性和状态单价

  2. 2

    组件,隔离功能和“参照透明性”

  3. 3

    当Java8使用参照透明性时

  4. 4

    类型推断会干扰参照透明性

  5. 5

    如何记录例外情况?

  6. 6

    建筑挤压的例外情况

  7. 7

    如何在不依赖公共数据上下文实例的情况下保持相关实体之间的参照透明性?

  8. 8

    Skrollr背景透明性?

  9. 9

    例外:无法绑定到目标方法,因为其签名或安全性透明性与委托类型的签名或安全性透明性不兼容

  10. 10

    例外:无法绑定到目标方法,因为其签名或安全性透明性与委托类型的签名或安全性透明性不兼容

  11. 11

    例外情况下正确工作

  12. 12

    OpenGL透明性不透明

  13. 13

    如何在Scala中跟踪嵌套期货的例外情况和结果

  14. 14

    如何保证F#应用程序中的参照透明性?

  15. 15

    CQRS-域例外与例外情况下的事件

  16. 16

    OpenGL透明性无法正常工作

  17. 17

    如何超越CSS的透明性方面

  18. 18

    Gnome终端的背景透明性

  19. 19

    定义参考透明性和确定性功能之间有什么区别?

  20. 20

    为引导程序导航栏和照片增加半透明性,并增加字体大小

  21. 21

    为什么Grails会删除我的例外情况?

  22. 22

    断路器有太多例外情况?

  23. 23

    例外情况在Java:如何减少重复的代码

  24. 24

    如何使用zio-test测试例外情况

  25. 25

    使用线程池时有哪些例外情况

  26. 26

    随机“根据验证过程,远程证书无效。” 例外情况

  27. 27

    在Outlook中,如何确定约会系列的例外情况?

  28. 28

    防止在例外情况下显示DLL源

  29. 29

    在证书名称中使用 IP 地址的例外情况

热门标签

归档