我的问题是,在下面的代码片段中,c2可以通过编译,但t2失败.为什么?
type PairT[A, B] = { //structural type
type T1 = A
type T2 = B
}
class PairC[A, B] {
type T1 = A
type T2 = B
}
case class TMap[A, B](a: A, b: B)
type MapC2[A] = TMap[p.T1, p.T2] forSome { val p: PairC[A, A] }
type MapT2[A] = TMap[p.T1, p.T2] forSome { val p: PairT[A, A] }
val c2: MapC2[Int] = TMap(1,2)
val t2: MapT2[Int] = TMap(1,2)
Run Code Online (Sandbox Code Playgroud) 在scalaz中,endo函数in Function1Ops以这种方式实现:
def endo(implicit ev: R =:= T): Endo[T] =
Endo.endo(t => ev(self(t)))
Run Code Online (Sandbox Code Playgroud)
我很好奇为什么在Endo.endo功能体中,而不仅仅是简单地把自己......当作Endo.endo(self)同样的行为Endo.endo(t=> ev(self(t))).
这是我的模仿实现,我发现两者没有区别.我错过了什么?
def endo[R, T](f: R => T)(implicit ev: T =:= R) = (x: R)=> ev(f(x))
def endo2[R, T](f: R => T)(implicit ev: T =:= R) = f
Run Code Online (Sandbox Code Playgroud)
此外,第一个实现是否在运行时增加了一些开销?
class A
class B extends A
class D { def get: A = ??? }
class E extends D { override def get: B = ??? } // OK
class F { def set(b: B): Unit = ??? }
class G extends F { override def set(a: A): Unit = ??? } // Compile Error, override nothing
Run Code Online (Sandbox Code Playgroud)
我的问题是为什么G不起作用,因为:(A => Unit)是(B => Unit)的子类型
implicitly[(A => Unit) <:< (B => Unit)]
Run Code Online (Sandbox Code Playgroud) 如果我理解正确EitherT[Option,A,B]应该是相同的Option[Either[A,B]],但编译器不同意.以下代码无法编译:
def f[A,B] = implicitly[EitherT[Option, A, B] === Option[Either[A,B]]]
Run Code Online (Sandbox Code Playgroud)
我错过了什么?