查找第一个否定条目的两个功能之间的本质区别是什么?

家蚕

从“现实世界Ocaml ”第24页(请参阅https://realworldocaml.org/v1/en/html/a-guided-tour.html#for-and-while-loops)。代码是:

# let find_first_negative_entry array =
     let pos = ref 0 in
     while !pos < Array.length array && array.(!pos) >= 0 do
       pos := !pos + 1
     done;
     if !pos = Array.length array then None else Some !pos
  ;;
val find_first_negative_entry : int array -> int option = <fun>
# find_first_negative_entry [|1;2;0;3|];;
- : int option = None
# find_first_negative_entry [|1;-2;0;3|];;
- : int option = Some 1 

# let find_first_negative_entry array =
     let pos = ref 0 in
     while
       let pos_is_good = !pos < Array.length array in
       let element_is_non_negative = array.(!pos) >= 0 in
       pos_is_good && element_is_non_negative
     do
       pos := !pos + 1
     done;
     if !pos = Array.length array then None else Some !pos
  ;;
val find_first_negative_entry : int array -> int option = <fun>
# find_first_negative_entry [|1;2;0;3|];;
Exception: (Invalid_argument "index out of bounds").

作者声称:

附带说明一下,前面的代码利用了&&,OCaml的And运算符发生短路的事实。特别是,在形式为expr1 && expr2的表达式中,只有在expr1计算为true时,才会对expr2进行评估。如果不是那样的话,那么前面的函数将导致越界错误。实际上,我们可以通过重写函数以避免短路来触发越界错误:”

但是我仍然不太明白为什么第一个代码可以正常工作,而第二个代码却得到异常。我已编译,两个函数的行为均符合预期。但是我很困惑为什么第二个功能不起作用,因为它也使用了&&命令,并且除了None以外,它也没有处理任何否定项。

石金属

这是评估的顺序。在第一个功能中,Term1 && Term2允许&&短路行为来保护我们免受Term2的侵害。在第二个示例中,总是在测试发生之前评估let绑定。因此,无法防止Term2的不良行为。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

这两个函数找到第一个否定条目的本质区别是什么?

来自分类Dev

int a = 0之间的本质区别是什么;和一个 a = 0 ;?

来自分类Dev

在C ++中找到两个向量中第一个公共条目的位置的最快方法是什么?

来自分类Dev

两个闭包之间的区别是什么?

来自分类Dev

bash中的复合命令和普通命令之间的本质区别是什么?

来自分类Dev

在 SQL 中查找实体的第一个和最后一个条目的最有效方法是什么?

来自分类Dev

查找两个句子之间匹配的第一个单词

来自分类Dev

这两个jQuery ajax调用之间的主要功能区别是什么?

来自分类Dev

2个功能之间的区别是什么

来自分类Dev

project.json中两个依赖项部分之间的区别是什么

来自分类Dev

这两个ID之间的主要区别是什么?

来自分类Dev

laravel 5.2中这两个back()方法之间的区别是什么?

来自分类Dev

以下两个实现之间的基本区别是什么?

来自分类Dev

这两个SSD之间的主要区别是什么?

来自分类Dev

project.json中两个依赖项部分之间的区别是什么

来自分类Dev

这两个类之间的逻辑区别是什么?

来自分类Dev

存储库的好处以及两个语句之间的区别是什么

来自分类Dev

这两个语句之间的语义区别是什么?

来自分类Dev

这两个查询一掷System.NotSupportedException的区别是什么

来自分类Dev

如何在r中找到第一个观测值与前两个连续的否定观测值之间的观测数

来自分类Dev

仅通过第一个单词查找两个数据框之间的匹配行

来自分类Dev

两次声明一个 n 元函数的目的是什么,使得第二个参数的顺序与第一个相反?

来自分类Dev

合并两个数据框并根据公共列选择第一个条目

来自分类Dev

从第一个条目到当前行条目的行日期之间的差异(以天为单位)

来自分类Dev

Scala-查找两个Seq不同的第一个位置

来自分类Dev

消费者路由器中的 WAN 和 LAN 端口之间的技术区别是什么?对于两个调制解调器,一个路由器设置

来自分类Dev

我的代码的这两个摘要之间有功能上的区别吗?第二个与第一个以同样的方式处理可能的错误吗?

来自分类Dev

mysql查询获取两个日期之间的第一个特定日期

来自分类Dev

在第一个组件执行之前,在两个组件之间共享值

Related 相关文章

  1. 1

    这两个函数找到第一个否定条目的本质区别是什么?

  2. 2

    int a = 0之间的本质区别是什么;和一个 a = 0 ;?

  3. 3

    在C ++中找到两个向量中第一个公共条目的位置的最快方法是什么?

  4. 4

    两个闭包之间的区别是什么?

  5. 5

    bash中的复合命令和普通命令之间的本质区别是什么?

  6. 6

    在 SQL 中查找实体的第一个和最后一个条目的最有效方法是什么?

  7. 7

    查找两个句子之间匹配的第一个单词

  8. 8

    这两个jQuery ajax调用之间的主要功能区别是什么?

  9. 9

    2个功能之间的区别是什么

  10. 10

    project.json中两个依赖项部分之间的区别是什么

  11. 11

    这两个ID之间的主要区别是什么?

  12. 12

    laravel 5.2中这两个back()方法之间的区别是什么?

  13. 13

    以下两个实现之间的基本区别是什么?

  14. 14

    这两个SSD之间的主要区别是什么?

  15. 15

    project.json中两个依赖项部分之间的区别是什么

  16. 16

    这两个类之间的逻辑区别是什么?

  17. 17

    存储库的好处以及两个语句之间的区别是什么

  18. 18

    这两个语句之间的语义区别是什么?

  19. 19

    这两个查询一掷System.NotSupportedException的区别是什么

  20. 20

    如何在r中找到第一个观测值与前两个连续的否定观测值之间的观测数

  21. 21

    仅通过第一个单词查找两个数据框之间的匹配行

  22. 22

    两次声明一个 n 元函数的目的是什么,使得第二个参数的顺序与第一个相反?

  23. 23

    合并两个数据框并根据公共列选择第一个条目

  24. 24

    从第一个条目到当前行条目的行日期之间的差异(以天为单位)

  25. 25

    Scala-查找两个Seq不同的第一个位置

  26. 26

    消费者路由器中的 WAN 和 LAN 端口之间的技术区别是什么?对于两个调制解调器,一个路由器设置

  27. 27

    我的代码的这两个摘要之间有功能上的区别吗?第二个与第一个以同样的方式处理可能的错误吗?

  28. 28

    mysql查询获取两个日期之间的第一个特定日期

  29. 29

    在第一个组件执行之前,在两个组件之间共享值

热门标签

归档