这是我第一次遇到以下警告"警告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"
警告显示以下行:
Js.Unsafe.fun_call
          (Js.Unsafe.variable "create_discreteBar_chart")
          [|
            Js.Unsafe.inject ((js_arr))              
          |];
对于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.