代码之家  ›  专栏  ›  技术社区  ›  oxbow_lakes

scala类型推理问题

  •  6
  • oxbow_lakes  · 技术社区  · 14 年前

    我只是和 Tony Morris' excellent exercise on catamorphisms 当我在思考以下情况时…

    def cata[X](some: A => X, none: => X): X
    

    现在让我按如下方式调用此方法:

    def isDefined: Boolean = cata( _ => true, false)
    

    我想知道类型推断器是否确定 _ => true 成为 A => Boolean Any => Boolean . 因为事实上 Function1 逆变式 在其输入参数中,以下两个编译都很好:

    def isDefined: Boolean = cata( (_: A) => true, false)    //#1
    def isDefined: Boolean = cata( (_: Any) => true, false)  //#2
    

    所以问题是,类型推断者想出了1还是2?

    1 回复  |  直到 14 年前
        1
  •  7
  •   Arjan Blokzijl    14 年前

    我试过了:

    
    trait MyOption[+A] {
       def cata[X](some: A => X, none: => X): X
       def isDefined: Boolean = cata( _ => true, false)
    }
    

    并用 scalac -Xprint:types . 这产生了以下输出:

    
    [[syntax trees at end of typer]]// Scala source: myoption.scala
    package  {
      abstract trait MyOption[A >: Nothing : Nothing  X, none: => X): X;
        def isDefined: Boolean = MyOption.this.cata[Boolean](((x$1: A) => true), false)
      }
    }
    

    因此,从外观上看,类型推断者想出了选项1。