我试图将列表中两个连续元素的平方差异相加。让我们调用执行此任务的函数sum_sq
,然后sum_sq [1;2;3]
将返回(1-2)^2 + (2-3)^2 = 2
。我现在只输入至少2个元素的列表,所以我不必处理空列表情况。这是我的想法:
let sum_sq_2elts x y = match x y with
|x::y -> (x - y) * (x - y)
let rec sum_sqrdiffs sum_sq = match sum_sq with
|x1::x2::[] -> (x1 - x2) * (x1 - x2)
|x::y::z -> sum_sq_2elts x y + sum_sqrdiffs z
我收到一条错误消息,指出Error: This expression has type int list but an expression was expected of type int
。这是为什么?
感谢您提前输入!
答案 0 :(得分:1)
当您撰写y
时,(x - y)
必须是一个列表。但是在箭头之后,你打电话给y
;这里let sum_squared_difference x y = (x - y) * (x - y)
必须是整数。这是你的不一致。
你为什么要尝试使用匹配和列表?你的功能很简单:
Here is an example of a case that is not matched: ...
即使我修复了这个问题,我也会遇到新的错误[...]我该如何处理?
首先,你的错误:
x
OCaml期望模式匹配是详尽无遗的:必须考虑由类型表示的每种可能的值。对于列表,您可以使用空列表[]或由xs
制作的列表,后跟子列表x::xs
,编写[1; 2; 3; 4]
。在你的函数中,当列表为空时会发生什么?如果只有一个元素会发生什么?案件未定义。
如何进行?让我们从头开始回顾所有可能的情况。但请注意,如果必须合并4个元素:
(1, 2)
(2, 3)
(3, 4)
您将要合并这些对:
x::xs
您将获得3个元素的列表。
当列表为至少一个元素时,可以将其分解为xs
:
xs
可能为空,在这种情况下,您没有下一个元素,需要返回一个空列表。这是你从N个元素到N-1的地方。
x
不是空的,您可以将xs
和>> pick 44835:11:58 / 24 1
== 1868
的头部合并来计算返回的值。
这可以帮助您考虑所有可能的情况。然后,您需要递归调用该函数。