【问题标题】:copy method and subtype polymorphism in ScalaScala中的复制方法和子类型多态性
【发布时间】:2017-01-08 03:34:29
【问题描述】:

我正在尝试解决以下 Scala 编译器错误。

case class CC[E](l:List[E])

trait D[E,L<:CC[E]]{
  def f(l:L):L = l.copy(l=List()) // does not compile: "found CC[E], required: L"
}

在(伪)-Haskell(没有子类型)中,这将类似于:

 data CC = CC {l::[e]}
 'makeLens CC
 f l = l .~ _e []

目前我正在研究 ScalaZ、Shapeless 和 Monocle。

乍一看,Monocle 似乎没有问题(虽然不确定),如果我的直觉错了,请证明我错了。

ScalaZ + Shapeless 可能probably 工作,我不确定如何(从未使用过它们)。

1) 在 Scala 中解决这个问题的最简单方法是什么?

2) ScalaZ 本身就足够了吗?还是无形本身就足够了?还是两者的结合是必要的?或者其他方式?

【问题讨论】:

标签: scala scalaz shapeless monocle-scala


【解决方案1】:

您可以使用Monocle 执行以下操作:

import monocle.macros.Lenses

@Lenses
case class CC[E](l:List[E])

object D {
  def f[E](cc: CC[E]): CC[E] = CC.l.set(List())(cc)
}

【讨论】:

  • 谢谢!很有意思 !如果 ccCC[E] 的子类型,这会起作用吗?似乎是这样,但我不确定。在这种情况下,Monocle 还需要能够复制子类型的字段。单片眼镜能做到吗?例如,如果DD extends CC[E] 有一个字段val d: String,那么f 也需要复制d,但是在为CC[E] 生成镜头时,Monocle 甚至不知道d。所以我想知道这如何工作?
  • 是的,如果你有一个Lens[CC[E], List[E]],你可以在DD extends CC[E]类型的值上使用它。但是,您不能使用@Lenses 来生成这样的Lens,因为它仅适用于案例类并且您不能扩展它们。
猜你喜欢
  • 2018-08-14
  • 2013-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-22
  • 1970-01-01
相关资源
最近更新 更多