Ocaml中列表的特殊总和

时间:2018-01-23 06:18:18

标签: ocaml

我试图将列表中两个连续元素的平方差异相加。让我们调用执行此任务的函数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。这是为什么? 感谢您提前输入!

1 个答案:

答案 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 的头部合并来计算返回的值。

这可以帮助您考虑所有可能的情况。然后,您需要递归调用该函数。