【问题标题】:Semicolon and nested if expressions in OCamlOCaml 中的分号和嵌套 if 表达式
【发布时间】:2013-01-23 07:15:27
【问题描述】:

好吧,我在 OCaml 中使用 semicolon (single and double)nested if else 时遇到问题。

例如


let union u p q = 
  let rec unionfy id_ary i =
    if i < Array.length id_ary then begin 
      if id_ary.(i) = p then begin 
        id_ary.(i) <- id_ary.(q);
        print_array id_ary 0;
      end
      unionfy id_ary (i + 1);
    end 
    else print_string "end of union";
  in
  unionfy u.id_ary 0;;

编译器说line 18, characters 29-95: Error: This expression is not a function; it cannot be applied

有问题的线路是if id_ary.(i) = p then begin,但我不明白为什么。


另外,谁能告诉我更多关于semicolonnested if else 的信息?

我想到了一些问题:

  1. 什么时候使用single semicolon?如果我将它用于多个表达式,是否必须在最后一个表达式后添加 double semicolon
  2. 我可以在nested if 中使用多个begin end 吗?

  3. 如果结果是unit and do nothing,好像不需要加else

【问题讨论】:

    标签: functional-programming ocaml


    【解决方案1】:

    问题是end。在这种情况下,整个if 表达式应返回unit,因此您需要在表达式末尾使用分号。另一个end 不需要它,因为if 表达式继续else 子句。下面,我已经删除了不必要的分号并添加了剩余的分号,

    let union u p q = 
      let rec unionfy id_ary i =
        if i < Array.length id_ary then begin 
          if id_ary.(i) = p then begin 
            id_ary.(i) <- id_ary.(q);
            print_array id_ary 0
          end;
          unionfy id_ary (i + 1)
        end 
        else print_string "end of union"
      in
      unionfy u.id_ary 0;;
    

    编辑:“规则”实际上是 OCaml 中分号的定义。它分隔返回unit 的顺序表达式。 begin ... end 之间的内容是单数表达式。整个if 表达式也是一个表达式,但由多个表达式组成。所以第一个if 语句中包含的两个语句是,

      if id_ary.(i) = p then begin ... end;
      unionfy id_ary (i + 1)
    

    【讨论】:

    • 为什么我们不需要'print_array id_ary 0, but we need one for unionfy id_ary (i + 1);`后面的;
    • 能否请您扩展您的答案以描述所有这些的一般规则?
    • 好的,我现在大致了解了。 ; 仅在您希望与多个表达式相邻时使用。在您或我的代码中,最里面的if begin end 实际上是一个表达式,与unionfy id_ary (i+1) 一起,它们是两个相邻的表达式,位于第一个if begin end 内。我说的对吗?
    • 因为 print_array 返回 unit 并且 begin ... end 之间的表达式应该具有 unit 类型。分号是let () = ... in 的语法糖。所以; 是分隔if 表达式和unionfy 表达式的必要条件。
    • 您能在这里查看我的另一个代码吗? stackoverflow.com/questions/14759932/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    • 1970-01-01
    • 2017-08-14
    • 1970-01-01
    • 2015-05-09
    • 2013-02-17
    相关资源
    最近更新 更多