我是OCaml的新手,我想写一个函数,它返回z下面所有3和5的倍数之和。
以下是我所做的:
let rec problemone x y z = match x with
| x when x > z -> y
| x when x mod 3 = 0 && x mod 5 = 0 -> problemone(x+1,y+x,z)
| x when x mod 3 = 0 && x mod 5 <> 0 -> problemone(x+1,y+x,z)
| x when x mod 3 <> 0 && x mod 5 = 0 -> problemone(x+1,y+x,z)
;;
不幸的是,它没有用,它告诉我:
Error: This expression has type 'a * 'b * 'c
but an expression was expected of type int
答案 0 :(得分:4)
OCaml中函数应用程序的语法是problemone (x+1) (y+x) z
,而不是problemone(x+1,y+x,z)
。
(x+1,y+x,z)
被解释为元组,这就是错误引用元组类型'a * 'b * 'c
的原因。元组作为第一个参数传递,预计为int
。并且由于函数是在OCaml中进行的,因此编译器不会考虑仅将一个参数应用于需要多个错误的函数。因此,它只会抱怨第一个论点的类型不匹配。
答案 1 :(得分:3)
您传递单个值(x+1, y+x, z)
(这是一个3元组)作为x
参数的值(并且不传递y
和{{1的任何值}})。
您需要将其称为z
。