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的问题,因为我想我会计算出两个数字的平均值,然后我会把它添加到空列表中?