Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ocaml中列表的特殊和_Ocaml - Fatal编程技术网

Ocaml中列表的特殊和

Ocaml中列表的特殊和,ocaml,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::[]

我试图求列表中两个连续元素的平方差之和。让我们调用执行此任务的函数
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
我收到一条错误消息说
错误:此表达式的类型为int list,但表达式的类型应为int
。为什么呢?
提前感谢您的输入

当您编写
x::y
时,
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: ...
OCaml希望模式匹配是彻底的:必须考虑类型所表示的每种可能的值。对于列表,您可以使用en-empty list[],也可以使用由
x
组成的列表,然后是一个子列表
xs
,编写为
x::xs
。在函数中,当列表为空时会发生什么?如果其中只有一个元素,会发生什么?这些案例没有定义

如何进行?让我们从头开始考虑所有可能的情况。但是请注意,如果必须组合4个元素:

[1; 2; 3; 4]
您将组合这些对:

(1, 2)
(2, 3)
(3, 4)
您将获得一个包含3个元素的列表

  • 如果列表为空,则返回一个空列表
  • 当列表至少包含一个元素时,它可以分解为
    x::xs

    • xs
      可能为空,在这种情况下,您没有下一个元素,需要返回一个空列表。这就是从N个元素总数到N-1的位置

    • xs
      不是空的,您可以将
      x
      xs
      的头组合起来计算返回值


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

即使我修复了这个问题,我也有一个新错误“下面是一个不匹配的示例:(:[]|[])val sum_sqrdiffs:int list->int=”。我怎样才能做到这一点?