Ocaml 为什么我会得到;此表达式的类型为int,但表达式的类型应为float“quot;错误?

Ocaml 为什么我会得到;此表达式的类型为int,但表达式的类型应为float“quot;错误?,ocaml,Ocaml,我需要找到一个二次方程的平方根:ax^2+bx+c=0 let h a b c = if (b*b-4*a*c) < 0 then begin print_string "There are no real solutions" end else if (b*b-4*a*c) = 0 then begin print_string "The equation has 1 solution x_1="; print_int ((-b)/(2*a));

我需要找到一个二次方程的平方根:ax^2+bx+c=0

let h a b c = 
  if (b*b-4*a*c) < 0 then begin 
    print_string "There are no real solutions" 
  end
  else if (b*b-4*a*c) = 0 then begin
    print_string "The equation has 1 solution x_1=";
    print_int ((-b)/(2*a));
  end
  else begin
    float_of_int a;
    float_of_int b;
    float_of_int c;
    print_float (((-.b)+.sqrt(b*.b-.4.*.a*.c))/.(2.*.a)); 
    print_float (((-.b)-.sqrt(b*.b-.4.*.a*.c))/.(2.*.a))
  end;;

还有其他更简单的方法来解决这个问题吗?

所以,我编辑了你的问题,因为它不可读,以后尝试这样格式化;-)

对于答案,这里是您的问题:OCaml是一种函数式语言,因此当您编写
float\u of_int a
时,它不会更改
a
(您应该得到一条警告,说明此表达式返回某些内容,但您不会处理它)。int的
float\u类型是
int->float
,所以你给它一个整数,它给你一个需要存储在变量中的浮点

你应该写的是:

begin
  let a = float_of_int a in
  let b = float_of_int b in
  let c = float_of_int c in
  print_float (((-.b)+.sqrt(b*.b-.4.*.a*.c))/.(2.*.a)); 
  print_float (((-.b)-.sqrt(b*.b-.4.*.a*.c))/.(2.*.a))
end;;

旁注:我不知道为什么不在第二个分支中将其转换为浮点,因为
-b/2a
不一定是整数



另一方面,由于您使用了四次
b*b-4*a*c
,请在开头将其放在变量中:
让delta=b*b-4*a*c在…

中,所以我编辑了您的问题,因为它不可读,以后请尝试这样格式化;-)

对于答案,这里是您的问题:OCaml是一种函数式语言,因此当您编写
float\u of_int a
时,它不会更改
a
(您应该得到一条警告,说明此表达式返回某些内容,但您不会处理它)。int
float\u类型是
int->float
,所以你给它一个整数,它给你一个需要存储在变量中的浮点

你应该写的是:

begin
  let a = float_of_int a in
  let b = float_of_int b in
  let c = float_of_int c in
  print_float (((-.b)+.sqrt(b*.b-.4.*.a*.c))/.(2.*.a)); 
  print_float (((-.b)-.sqrt(b*.b-.4.*.a*.c))/.(2.*.a))
end;;

旁注:我不知道为什么不在第二个分支中将其转换为浮点,因为
-b/2a
不一定是整数



作为另一个旁注,由于您使用了四次
b*b-4*a*c
,请将它放在开头的变量中:
let delta=b*b-4*a*c in…

谢谢您的帮助和旁注:D。我将尝试解决它并写回。但是,每次“让”之后,“in”是什么意思呢?我可以用“;”而不是“in”吗?这是我最讨厌OCaml语法的地方之一。您有两种
let
:用于声明函数和变量(以及其他事物)的全局函数和用于声明局部函数或变量(以及其他局部事物)的局部函数。当您声明本地内容时,您必须在
中写入
,如“让我们声明此块其余部分中等于3的变量a”。是的,这是不连贯的,我更喜欢使用
val
作为全局声明,但您不必选择,对吗?(我又加了一张便条)哦,我明白了。所以,当我在一个块中添加一个变量,比如在一个函数中,我总是需要在声明它之后写“in”,就像“让变量在函数中”??没错。当您在块中使用let in时,始终需要一个in.。-)而且我也知道,如果我在一个“如果”中有更多的表达式,那么我需要用“;”来分隔它们。当您声明变量时,您不需要使用“;”?感谢您的帮助和旁注:D。我将尝试解决它并写回。但是,每次“让”之后,“in”是什么意思呢?我可以用“;”而不是“in”吗?这是我最讨厌OCaml语法的地方之一。您有两种
let
:用于声明函数和变量(以及其他事物)的全局函数和用于声明局部函数或变量(以及其他局部事物)的局部函数。当您声明本地内容时,您必须在
中写入
,如“让我们声明此块其余部分中等于3的变量a”。是的,这是不连贯的,我更喜欢使用
val
作为全局声明,但您不必选择,对吗?(我又加了一张便条)哦,我明白了。所以,当我在一个块中添加一个变量,比如在一个函数中,我总是需要在声明它之后写“in”,就像“让变量在函数中”??没错。当您在块中使用let in时,始终需要一个in.。-)而且我也知道,如果我在一个“如果”中有更多的表达式,那么我需要用“;”来分隔它们。当您声明变量时,您不需要使用“;”?