没有函数参数的Scala类型类

时间:2014-12-30 07:34:02

标签: scala generics typeclass implicit

我目前正在scala中使用我的网络库。我遇到过这样的事情:

object Packet {
  trait Reader[T] {
    def read(iterator: ByteIterator): T
  }

  object Reader {
    implicit object ByteReader extends Reader[Byte] {
      def read(iterator: ByteIterator): Boolean = iterator.getByte
    }
  }
}

class Packet {
  import Packet._

  def iterator: ByteIterator

  def read[T](implicit e: Reader[T]): T = {
    e.read[T]()
  }

  def readByte(): Byte = {
    this.read[Byte]()  // <- Unspecified value parameter e
  }
}

当我在网上搜索答案时,我读到的所有例子都是关于函数WITH参数,而不是像我,我的&#34;阅读&#34; function取0参数。这是问题吗?我该如何解决这个问题?

我来自C ++背景,知道Haskell的基本知识,就像类型类的东西一样。在C ++中,我可以进行模板专业化以使其工作。在Haskell中,(read :: Byte)将起作用。我试图使用反射,但由于数据包读写是一个非常低级别的操作,反射应该对性能非常不利。有没有办法使这项工作?

1 个答案:

答案 0 :(得分:1)

前置空参数列表:

def read[T]()(implicit e: Reader[T]): T =
  e.read(iterator)

def readByte(): Byte =
  this.read[Byte]()  // <- HURRAY IT WORKS

在调用站点删除参数列表(())也有效,但通常不赞成,因为语法无参数调用应该是参考透明的。