在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,但我想

我目前正在使用Scala中的特殊多态性编写一些代码

例如,我的一个类使用以下方法扩展了
流[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,这会使代码非常混乱

我认为我的选择是:

  • 教specs2使用猫的表演[T]而不是使用toString-可能吗?我已经看到了一个包,但是我似乎找不到scala 2.12的包
  • 如上所述,每次使用流时都使用“展开”
  • 在我的情况下,您认为以上哪一个选项最有效?

    非选项:

  • 从Stream扩展我自己的类-它是密封的,这是有充分理由的
  • 将流映射的所有方法写入展开-我觉得太费劲了

  • 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哦,是的,很好的把戏!谢谢