这是我第一次遇到以下警告"警告21:此语句永远不会返回(或有一个不健全的类型.)",我不知道如何解决它.
let display_committers_stats response = match response##readyState with
| XmlHttpRequest.DONE ->
begin match response##status with
| 200 ->
Js_client_ui.create_menu_tabs "GitSearchTabs";
let l =
Json_parser.get_commits (Js.to_string response##responseText) in
let values =
Json_parser.group_commits_by_user l
|> List.map (fun (author, commits) ->
Js_data.create_discreteBar_item author (float_of_int commits))
|> Array.of_list
|> Js.array in
let discreteBar_chart =
Js_data.create_discreteBar_chart "Commits-impact" values in
let js_arr = Js.array ([|discreteBar_chart |]) in
Js.Unsafe.fun_call
(Js.Unsafe.variable "create_discreteBar_chart")
[|
Js.Unsafe.inject ((js_arr))
|];
let js_arr =
l
|> List.mapi (fun i commit ->
Js_data.create_timeline_data i commit.Git_data.message
commit.Git_data.time)
|> Array.of_list
|> Js.array in
Js.Unsafe.fun_call
(Js.Unsafe.variable "create_timeline")
[|
Js.Unsafe.inject ((js_arr))
|]
| _ -> Printf.printf "Unexcepted status\n" end
| _ -> Printf.printf "Unexcepted state\n"
Run Code Online (Sandbox Code Playgroud)
警告显示以下行:
Js.Unsafe.fun_call
(Js.Unsafe.variable "create_discreteBar_chart")
[|
Js.Unsafe.inject ((js_arr))
|];
Run Code Online (Sandbox Code Playgroud)
对于Ocaml中的执行倍数表达式,我知道问题是要使用; 表达式之间,但我的功能现在有什么问题?我可以提一些建议吗?
ant*_*ron 10
尝试包含调用ignore,即代替Js.Unsafe.fun_call ...;,ignore (Js.Unsafe.fun_call ...);.
发生这种情况的原因是因为您的JS函数调用具有结果类型" 'b",它不依赖于任何参数类型.在OCaml类型系统中,这通常意味着函数不返回,因为'b从无"生成"任意类型的值的唯一方法是引发异常 - 也就是说,放弃尝试生成它.
序列表达式(分号)e1; e2表示完成第一个表达式,然后完成第二个表达式.在这种情况下,OCaml担心你的e1(JS函数调用)因为其无约束的结果类型而无法完成,如上所述.这会使序列表达无意义,这就是你得到警告的原因.但是,我们知道原因e1有一个不受约束的结果类型并不是因为它没有完成,而是因为我们使用了一个不安全的JS绑定.
为了解决这个问题,e1请调用ignore一个函数,该函数接受任何操作并计算单位.现在,;将"看到" unit它的左侧而不是不受约束的'b.
一般来说,你总是希望unit在左边有一个类型的表达式;.因此,即使您有一个表达式求值为约束类型(例如int参数类型中提到的具体类型或类型参数),如果该类型不是unit,您仍应将该表达式包装在其中ignore.