为什么会给我这个错误?此表达式的类型为 Z.t 但表达式应为 int 类型

Why is it giving me this error? This expression has type Z.t but an expression was expected of type int

已编辑:好的,这是完整的错误:

45 |               | _ -> Z.of_int 3 * Z.(s1 (num-1)) + Z.(sum_s1 num)
                  ^^^^^^^^^^
Error: This expression has type Z.t but an expression was expected of type
         int 

这是有问题的代码:

let rec s1 num =
              match num with
               | 0 -> Z.of_int(1)
               | 1 -> Z.of_int(2)
               | _ -> Z.of_int 3 * Z.(s1 (num-1)) + Z.(sum_s1 num)
            and
              sum_s1 num =
               let rec sum_s1_impl (num, k) =
                 if (num-2 < 1) || (k > num-2) then 0
                 else (s1 k) * (s1 (num-k-1)) + (sum_s1_impl (num, k+1))
               in sum_s1_impl (num, 1);;

我不知道problem/how我可以修复它吗(一些提示)

谢谢!!

编辑#2:

let rec s1 num =
              match num with
               | 0 -> Z.of_int(1)
               | 1 -> Z.of_int(2)
               | _ -> Z.of_int(3 * (s1 (num-1)) + (sum_s1 num))
            and
              sum_s1 num =
               let rec sum_s1_impl (num, k) =
                 if (num-2 < 1) || (k > num-2) then 0
                 else (s1 k) * (s1 (num-k-1)) + (sum_s1_impl (num, k+1))
               in sum_s1_impl (num, 1);;

即使使用Z.of_int(3 * (s1 (num-1)) + (sum_s1 num)) 我仍然得到同样的错误

您正在将非整数类型 Z.of_int 3 乘以整数(* 运算符)。

尝试用整数进行运算,然后将最终结果转换为Z.of_int (your result)

编辑:另外,您可以使用 built-in zerith 运算符,即:

val add : t -> t -> t
Addition.

勾选https://www-apr.lip6.fr/~mine/enseignement/l3/2015-2016/doc-zarith/Z.html

一般来说,您需要仔细跟踪哪些参数是 int(普通 OCaml 整数)类型,哪些是 Z.t(大整数)类型。您似乎将它们视为同一类型,这在强类型语言中不起作用。

第一个报告的错误是针对这个表达式的:

Z.of_int 3 * Z.(s1 (num-1)) + Z.(sum_s1 num)

如果我查看 s1 的代码,它表明它需要一个 int 参数,因为它与参数 0、1 等相匹配。类似地,[=16 的代码=] 需要一个 int 参数,因为它将 built-in - 运算符应用于参数。

根据这些假设,此表达式中的第一个问题是 Z.of_int return 是一个大整数 (Z.t)。您不能使用 built-in * 运算符将大整数相乘。

但是请注意,这个子表达式看起来也是错误的:

Z.(s1 (num - 1))

由于表达式以 Z. 为前缀,运算符将来自 Z 模块。因此 -Z.t -> Z.t -> Z.t 类型。但是您将它应用于 num1,它们是普通的 OCaml 整数。

您需要遍历表达式并找出每个子部分所需的类型。通常你想做所有事情都使用大整数,所以当你有一个常规的 OCaml int 时,你应该使用 Z.of_int 进行转换。大多数函数的参数和 return 值(在我看来)应该是大整数。