为什么会给我这个错误?此表达式的类型为 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
类型。但是您将它应用于 num
和 1
,它们是普通的 OCaml 整数。
您需要遍历表达式并找出每个子部分所需的类型。通常你想做所有事情都使用大整数,所以当你有一个常规的 OCaml int 时,你应该使用 Z.of_int
进行转换。大多数函数的参数和 return 值(在我看来)应该是大整数。
已编辑:好的,这是完整的错误:
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
类型。但是您将它应用于 num
和 1
,它们是普通的 OCaml 整数。
您需要遍历表达式并找出每个子部分所需的类型。通常你想做所有事情都使用大整数,所以当你有一个常规的 OCaml int 时,你应该使用 Z.of_int
进行转换。大多数函数的参数和 return 值(在我看来)应该是大整数。