表达式期望的类型单元,但它已经是

expression expected type unit, but it already does

let _ =
    try ("hello"; ()) with
    | _ -> print_endline "hi"

编译这个告诉我 ("hello"; ()) 'should have type unit'

事实上,我用这段代码得到了同样的警告

let _ = "hello"; ()

或此代码

let _ = ("hello"; ())

但是它 的类型是 unit ...不是吗?

表达式:

 let f  = "hello";1;;

触发警告:

 this expression should have type unit - around "hello" string.

这是因为您试图通过 "hello" return 第一个值,然后 return 1 意味着 ocaml 必须忽略 "hello" . 如果您将其替换为 unit - 意思是 "here I return nothing",就可以了。

表达式:

let f = (); 1;;

不发出警告,fint

因此您收到的警告与表达式的内部代码有关,与您编写的表达式的类型无关。

let f = "hello";();;

编译器警告你计算了一些你之后忽略的东西("hello" 从未使用过,return 的值是 f()) .但是,正如您所注意到的,f 的类型为 unit

utop中:

let _ = try ("hello"; ()) with
    | _ -> print_endline "hi";;

你得到:

Characters 13-20:
Warning 10: this expression should have type unit.

精确定位到 "hello" 字符串的位置 - 但不定位到 ("hello"; ())("hello"; ()) 有类型单位,与 print_endline "hi" 完全一样。

警告只是关于应该代替 "hello"; 的表达式应该具有类型单位这一事实。