代码之家  ›  专栏  ›  技术社区  ›  M. Walker

无法键入多态[%bs.raw函数

  •  2
  • M. Walker  · 技术社区  · 7 年前

    1) 有没有办法键入此内容?2) 有谁能解释这些错误信息?

    let identity1: 'a => 'a = [%bs.raw {|
      function(value) {
        return value
      }
    |}];
    
    /*
    Line 2, 11: The type of this expression, '_a -> '_a, contains type variables that cannot be generalized
    */
    
    let identity2: 'a. 'a => 'a = [%bs.raw {|
      function(value) {
        return value
      }
    |}];
    
    /*
    Line 8, 11: This definition has type 'a -> 'a which is less general than 'a0. 'a0 -> 'a0
    */
    

    https://reasonml.github.io/en/try.html?reason=FAGwpgLgBAlgJmAdhGECeBGAXFA5AQygF4A%20PQoqAbQFIAjAZwDoAnfAdygG8AfYKKADMArogDGKAPaIAFADd8IYWACU3fgKgtIwloigKlYDQF9gPEwF0A3MGAB6AFTAAMjERgoAJgA0UDNhQACoAFp7oAA6ekoJQECEwDFBgAB4R2gwMMNJ%20uAD6hAC0ZPn4fmLSEPjuSZGeCiww%20HTgtSH40GL4iIiS0HSeAOZIYGwgMABeYHDAjvZ24NDwSCjoXjgETOTEJRTU9MxsnLwaIuJSsobKalwaAtoQuvpXxgJmFjZ2Tq7ungAcfgCOFCiSgCEE7lQ2X07VqaCi22K23YCTEIVgSVaSWGHjGcXa%20gIAAYtsSoEjibN5kA

    1 回复  |  直到 7 年前
        1
  •  5
  •   octachron    7 年前

    bs.raw 是有效的(准确地说是扩展的),因此它受到价值限制: http://caml.inria.fr/pub/docs/manual-ocaml/polymorphism.html#sec51

    简而言之,函数应用程序的结果类型无法概括,因为它可能捕获了一些隐藏的引用。例如,考虑函数:

    let fake_id () = let store = ref None in fun y ->
      match !store with
      | None -> y
      | Some x -> store := Some x; y
    
    let not_id = fake_id ()
    let x = not_id 3
    

    然后下一次应用 not_id 将是 3 . 因此 not\U id 不能是 ∀'a. 'a -> 'a . 这就是为什么类型检查器会为您的函数推断类型 '_weak1 -> '_weak1 (使用4.06符号)。此类型 _weak1 不是多态类型,而是未知具体类型的占位符。

    在正常情况下,解决方案是 not\U id 具有·-扩展的值:

     let id x = fake_id () x 
     (* or *)
     let id: 'a. 'a -> 'a = fun x -> fake_id () x 
    
    推荐文章