在scala中使用特殊多态性时,我应该创建一个额外的类型吗?
我目前正在使用Scala中的特殊多态性编写一些代码 例如,我的一个类使用以下方法扩展了在scala中使用特殊多态性时,我应该创建一个额外的类型吗?,scala,functional-programming,specs2,library-design,Scala,Functional Programming,Specs2,Library Design,我目前正在使用Scala中的特殊多态性编写一些代码 例如,我的一个类使用以下方法扩展了流[Boolean]: implicit class BooleanStreamOps(s: Stream[Boolean]) { def toByteStream: Stream[Byte] = ??? // ... } 到目前为止,这是好的,但是当流被打印时(例如通过specs2),它将打印整个流,如果它已经被评估过的话,它会对控制台的输出进行垃圾处理 现在我试图覆盖toString,但我想
流[Boolean]
:
implicit class BooleanStreamOps(s: Stream[Boolean]) {
def toByteStream: Stream[Byte] = ???
// ...
}
到目前为止,这是好的,但是当流被打印时(例如通过specs2),它将打印整个流,如果它已经被评估过的话,它会对控制台的输出进行垃圾处理
现在我试图覆盖toString,但我想我必须为保存流的对象创建一个额外的类,如下所示:
final case class BooleanStream(unwrap: Stream[Boolean]) {
override def toString: String = s"Stream(${unwrap.size})"
}
implicit class BooleanStreamOps(s: BooleanStream) {
def toByteStream: Stream[Byte] = ???
}
这有一个很好的效果,即同样使用Stream[Boolean]的库用户不会意外地调用我的方法之一。
缺点是,每当我使用实际的流时,我都必须调用对象上的unwrap,这会使代码非常混乱
我认为我的选择是:
1如果可能的话。顺便说一句,我认为这与类型类没有任何关系(除了
Show[…]
这不是问题的真正内容)。感谢您的回复!你是对的,不是在上面的例子中-它被简化了。另一个选项:implicit def unwrap(bs:BooleanStream):Stream[BooleanStream]=bs.unwrap
定义在BooleanStream
的伴生对象中。或者滚动你自己的Show[T]
。很简单,跟着:@AlvaroCarrasco哦,是的,很好的把戏!谢谢1如果可能的话。顺便说一句,我认为这与类型类没有任何关系(除了Show[…]
这不是问题的真正内容)。感谢您的回复!你是对的,不是在上面的例子中-它被简化了。另一个选项:implicit def unwrap(bs:BooleanStream):Stream[BooleanStream]=bs.unwrap
定义在BooleanStream
的伴生对象中。或者滚动你自己的Show[T]
。很简单,跟着:@AlvaroCarrasco哦,是的,很好的把戏!谢谢