作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图在 Scala 2.13 中至少模拟联合类型的某些方面。
到目前为止,满足我需求的最佳方法是 coproduct
从无形。唯一的问题是子类型没有按我预期的那样工作。下面是一个例子:
import shapeless._
type ISB = Int :+: String :+: Boolean :+: CNil
type ISBSub = Int :+: String :+: CNil
implicitly[ISBSub <:< ISB] // error here
ISB
的方法并想要这个
def
接受
ISBSub
以及。
def test(t: ISB) = ???
test(Coproduct[ISBSub](2)) // not working
coproduct
实现这样的目标吗? ?
最佳答案
鉴于 Shapeless 对副产品的编码,这种子集关系不可能与子类型相同。相反,有一个类型类可以证明一个联积是另一个联积的子联合:
scala> import shapeless._
import shapeless._
scala> type ISB = Int :+: String :+: Boolean :+: CNil
defined type alias ISB
scala> type ISBSub = Int :+: String :+: CNil
defined type alias ISBSub
scala> shapeless.ops.coproduct.Basis[ISB, ISBSub]
res0: shapeless.ops.coproduct.Basis[Int :+: String :+: Boolean :+: shapeless.CNil,Int :+: String :+: shapeless.CNil]{type Rest = Boolean :+: shapeless.CNil} = shapeless.ops.coproduct$Basis$$anon$64@ddd69d2
import shapeless.ops.coproduct.Basis
def shrink[A <: Coproduct, B <: Coproduct](a: A)(implicit ev: Basis[A, B]): Option[B] =
ev(a).toOption
def enlarge[A <: Coproduct, B <: Coproduct](b: B)(implicit ev: Basis[A, B]): A =
ev.inverse(Right(b))
scala> shrink[ISB, ISBSub](Coproduct[ISB](1))
res0: Option[ISBSub] = Some(Inl(1))
scala> enlarge[ISB, ISBSub](Coproduct[ISBSub](1))
res1: ISB = Inl(1)
shapeless.ops
的内容是值得的。包以了解副产品等支持哪些类型的操作。
关于scala - 无形的副产品子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58041305/
我发现自己在我的设计中遇到了相同的模式,我从一个具有几个数据构造函数的类型开始,最终希望能够针对这些数据构造函数进行输入,从而将它们拆分为自己的类型,然后必须增加在我仍然需要表示多个这些类型(即集合)
我是一名优秀的程序员,十分优秀!