小编che*_*hry的帖子

Scala结构类型和存在类型问题

我的问题是,在下面的代码片段中,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)

scala

6
推荐指数
1
解决办法
254
查看次数

不明白scalaz endo的功能

在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)

此外,第一个实现是否在运行时增加了一些开销?

functional-programming scala implicit-conversion scalaz

5
推荐指数
1
解决办法
473
查看次数

Scala - 为什么无法覆盖超类的方法

  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)

scala

3
推荐指数
1
解决办法
70
查看次数

EitherT [Option,A,B] ===选项[A [B,B]]

如果我理解正确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)

我错过了什么?

scala scalaz

2
推荐指数
1
解决办法
133
查看次数