scala – 为什么传递Int,F [_]参数预期有效?
发布时间:2020-12-16 09:20:12 所属栏目:安全 来源:网络整理
导读:假设我们有一个功能: def bar[F[_],A](x: F[A],y: F[A]) = null 以下所有行为均清楚: bar(List(1,2,3),List(1)) // compile okbar(List(1),Some(1)) // doesn't compile 但, bar(1,List(1)) // compile okbar(1,1) // compile ok 为什么? 附:例如FSiS Pa
假设我们有一个功能:
def bar[F[_],A](x: F[A],y: F[A]) = null 以下所有行为均清楚: bar(List(1,2,3),List(1)) // compile ok bar(List(1),Some(1)) // doesn't compile 但, bar(1,List(1)) // compile ok bar(1,1) // compile ok 为什么? 附:例如FSiS Part 1 – Type Constructors,Functors,and Kind Projector 解决方法
我认为以下是一个线索(虽然还有一些神秘的含义):
def baz[F[_],A](x: F[A]): F[A] = x scala> baz("str") res5: Comparable[String] = str scala> baz(1) res6: Any = 1 scala> class Foo defined class Foo scala> baz(new Foo) <console>:15: error: no type parameters for method baz: (x: F[A])F[A] exist so that it can be applied to arguments (Foo) --- because --- argument expression's type is not compatible with formal parameter type; found : Foo required: ?F baz(new Foo) ^ <console>:15: error: type mismatch; found : Foo required: F[A] baz(new Foo) ^ scala> case class Foo2 warning: there were 1 deprecation warning(s); re-run with -deprecation for details defined class Foo2 scala> baz(Foo2) res10: scala.runtime.AbstractFunction0[Foo2] = Foo2 因此,函数bar和baz可以找到它们可以的任何容器类型(对于String,对于case类来说可以是StringFunction0等)来匹配预期的F [_]. 猜测:在Int的情况下,我怀疑我们正在为底层字节码中的(boxed)原始类型打入一个特殊的“容器”类型.如果这种特殊类型只能打印回Scala为“Any”,但实际上是一些特殊的类型,我们可以将其视为“任何[_]”,这样可以解释我们看到的结果.作为对原语的特殊处理的说明,请注意,对于非原始简单类型,如上面的(非case)类Foo,它失败. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |