此表达式的类型为a * b * c,但预期类型为int

时间:2018-01-23 21:57:05

标签: compiler-errors ocaml typeerror

我是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

2 个答案:

答案 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