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
可能为空,在这种情况下,您没有下一个元素,需要返回一个空列表。这就是从N个元素总数到N-1的位置xs
不是空的,您可以将xs
和x
的头组合起来计算返回值xs
这可以帮助你考虑所有可能的情况。然后,您需要递归调用该函数。即使我修复了这个问题,我也有一个新错误“下面是一个不匹配的示例:(:[]|[])val sum_sqrdiffs:int list->int=”。我怎样才能做到这一点?