如果没有其他语句,是否有可能嵌套。 我编写了以下无用的程序来演示嵌套的ifs。 我该如何解决这个问题,以便就语法而言是正确的。 第5和6行给出了错误。

let rec move_helper b sz r = match b with
    [] -> r
    |(h :: t) ->
        if h = 0 then
            if h - 1 = sz then h - 1 ::r
            if h + 1 = sz then h + 1 ::r
        else move_helper t sz r
;;

let move_pos b = 
    move_helper b 3 r
;;

let g = move_pos [0;8;7;6;5;4;3;2;1]

#1楼 票数:4 已采纳

你不能有if没有else ,除非该表达式的结果是一个类型的unit 您的代码不是这种情况,因此是不可能的。

这是一个结果为unit的示例:

let f x =
    if x land 1 <> 0 then print_string "1";
    if x land 2 <> 0 then print_string "2";
    if x land 4 <> 0 then print_string "4"

#2楼 票数:1

您必须了解if ... then是一个与其他表达式一样的表达式。 如果没有else内容,则必须将其理解为if ... then ... else ()并因此具有类型unit 为了强调它是一个表达式的事实,假设您有两个类型为fg的函数,例如int → int 你可以写

(if test then f else g) 1

您还必须了解x :: r根本不会改变r ,它构造了一个将x放在r前面的新列表(此列表的尾部与列表r共享)。 在您的情况下,逻辑尚不清楚:当h=0if两个失败,结果是什么?

let rec move_helper b sz r = match b with
  | [] -> r
  | h :: t ->
     if h = 0 then
       if h - 1 = sz then (h - 1) :: r
       else if h + 1 = sz then (h + 1) :: r
       else (* What do you want to return here? *)
     else move_helper t sz r

  ask by rightDrop translate from so

未解决问题?本站智能推荐:

3回复

模式匹配ocaml中的嵌套元组

我试图递归地浏览文件和文件夹的嵌套列表。 在执行此操作时,我想打印访问的文件和文件夹的名称,但是我做错了什么。 这就是我所拥有的: 这样做我得到 行(File f :: t -> visit t) 。 我究竟做错了什么? 编辑1 现在的代码 但我在最后一行仍然收
2回复

OCaml交联

参考链接如何在OCaml中工作? 例如,假设我有3个模块声明为 A.ml B.ml C.ml 其中 A需要B和C B需要A 我该如何进行编译? 由于订单是使用ocamlc或ocamlopt相关的,我如何修复B和A之间的交叉引用? 我试图首先使用o
1回复

OCaml幂函数

我正在尝试编写 Ocaml 幂函数,但出现错误。 下面是我的代码。
1回复

河内塔在OCaml

我是一名初学者的OCaml程序员,试图在解决方案中的OCaml中实现解决河内塔楼问题的功能,该方法由一系列移动组成,其中“移动”存储在表格的元组中(startPeg,endPeg)。 这是我到目前为止的内容: 我收到错误消息: 文件“ induction.ml”,第8行,字符8-27
1回复

Ocaml:元组列表上的递归

我有下面的函数表,其中包含一个元组列表(x是字符串,y是字符串列表),我想返回一个元组x1和列表y1的长度。 我用这个简单的功能试了一下: 但是发生了以下错误: 错误:此表达式的类型为('a *'b list *'c *'d)list->('a * int)list,但是期望表
1回复

OCaml中的尾递归

我正在尝试使用Tail递归在OCaml中实现合并功能,但是我遇到了尴尬的结果。 谁能帮我这个忙。 提前致谢。
1回复

OCaml递归函数

我是OCaml的新手。 我写了这段代码来减少代数表达式: 我用这种方式调用simplify_expr: 我得错了答案: 下面我粘贴调用的堆栈。 我不知道,为什么在使用1(第9行)返回eval后,使用Add调用simplify_expr。 有人可以帮忙吗?
1回复

OCaml中的列表匹配

我有正在Ocaml中使用的功能。 它包含一个接受两个字符串列表并返回一个字符串列表的函数。 该功能的操作如下。 它扫描第一个列表中的每个字符串,如果在第二个列表中找到相应的匹配项,则返回该匹配项。 如果第二个列表有重复的匹配项,则该匹配项将返回两次。 这是我编写的描述预期行为的测试用例