Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.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
If statement Ocaml语法错误,如果语句具有模式匹配,则应为单int_If Statement_Design Patterns_Pattern Matching_Ocaml - Fatal编程技术网

If statement Ocaml语法错误,如果语句具有模式匹配,则应为单int

If statement Ocaml语法错误,如果语句具有模式匹配,则应为单int,if-statement,design-patterns,pattern-matching,ocaml,If Statement,Design Patterns,Pattern Matching,Ocaml,当我运行下面显示的代码时,我得到一个错误,我也在下面显示了,我不确定为什么会发生这种情况 let average x y = ((x+y)/2);; let rec average2 xs = function | [x,y] -> average x y :: xs | x :: y :: xs -> if xs = [] then average x y :: xs else average2 xs;; Error: This expression has typ

当我运行下面显示的代码时,我得到一个错误,我也在下面显示了,我不确定为什么会发生这种情况

let average x y = ((x+y)/2);;



let rec average2 xs = function

| [x,y] -> average x y :: xs

| x :: y :: xs -> if xs = [] then average x y :: xs else average2 xs;;



Error: This expression has type int * int but an expression was expected of type int  
最后一行中的字母x被此错误加下划线,但在定义平均值函数时,它应该只重新运行一个int来添加到xs列表中

感谢您的帮助

您使用逗号(
)而不是(
)来分隔列表中的元素。语法
[a,b;c,d]
[(a,b);(c,d)]
的缩写。因此,您的第一个模式实际上对应于一个带有一对元素的单例列表

您的功能还存在其他问题:

函数
关键字使用不当 第二个错误是不正确使用
函数
关键字。语法,
let f x=function y->expr
let f x y=expr
相同。因此,您的函数实际上需要两个参数,
xs
,它从未在主体中使用过,而第二个参数则通过模式匹配被破坏。你真正的意思是:

let average2 = function
| ...
不清楚函数在做什么 您的函数实际上是在生成一个列表,尽管事实上列表的平均值应该是标量。也许您正在试图找到一个运行平均值,因此如果您有列表
[1;3;5;7]
,结果将是
[2;6]

模式匹配的坏例子 你应该归纳地定义你的算法。从简单的案例开始,然后转移到更复杂的案例。假设您正在尝试计算后续元素的运行平均值:

let average2 = function
空列表的运行平均值是多少?我们在这里有不同的可能答案,我们可以提出一个错误,并要求用户提供一个长度大于2的偶数列表,或者我们可以说它是一个空列表

  | [] -> []
单身人士名单的运行平均值是多少?假设它是相同的列表:

  | [x] -> [x]
现在,列表的运行平均值是多少?它是
x1
x2
的平均值,然后是
xs的运行平均值

  | x1::x2::xs -> (x1 + x2)/2 :: average2 xs
因此,最后我们有:

let rec average2 = function
  | [] -> []
  | [x] -> [x]
  | x1 :: x2 :: xs -> (x1 + x2) / 2 :: average2 xs
詹姆斯

你可能和我学的是同一个模块,而我有同样的作业

我可以告诉你,到目前为止,上面的答案对学习是非常好的,虽然它不能提供你的问题的确切答案,但它创造了一个如何做的想法

您正在寻找的是一个替代功能

您需要输入[1;10;15;20]并返回[5;12;17],其中5是1和10之间的平均值,12是10和15的平均值,17是15和20的平均值

要实现这一点,您需要一个辅助函数,使您能够在不更改给定列表中的辅助值的情况下达到辅助值(如果使用
x1::x2::xs->(x1+x2)/2::average2 xs

let head xs = match xs with 
| [] -> failwith "head" 
| x::xs->x;;
现在,您可以调用它,这样它就可以在不中断顺序的情况下返回平均值的第二个元素,这样您就可以选择一个元素,在列表中取平均值,然后跳到下一个元素,直到完成为止

let rec average2 = function
  | [] | [_] -> []
  | x1 :: xs -> (x1 + head xs) / 2 :: average2 xs

呵呵,这种情况经常发生在我身上,尤其是当我用Haskell或Python进行流氓编程时。)我不理解你的代码。模式匹配的第二行没有任何意义。如果xs=[],那么average x y::xs,但是xs是空的,所以应该在第一个分支中处理它,否则在列表的其余部分调用average2,这样就完全忘记了x和y。最后,您将对列表中的最后两个元素进行平均。我有点搞不懂你想在这里做什么非常感谢你我甚至都没注意到,我已经改变了这一点,但我似乎得到了另一个错误错误:这个表达式的类型是int list->int list,但是一个表达式的类型应该是int list。它说它在递归函数的第三行。非常感谢你,我不想一直问问题,但是如果我删除了xs,只得到一个语法错误作为我的xs,这是我的输入尚未定义。我也不知道如何解决平均数xy的问题,因为我想我会计算出两个数字的平均值,然后我会把它添加到空列表中?