在下面的示例中,调用函数以构造实现某些类型类(例如deserialize )的实例的首选方法是什么:
// Simulacrum annotation
@typeclass trait Encodable[A] {
def deserialize(bytes: Seq[Byte]): Try[A] // Constructor
def serialize(proof: A): Seq[Byte]
}
// implementation Encodable for Int
implicit val IntEncodable: Encodable[Int] = new Encodable[Int] {
def deserialize(bytes: Seq[Byte]): Try[Int] = Success(bytes.head)
def serialize(value: Int): Seq[Byte] = List(value.toByte)
}
// import Simulacrum generated ops
import Encodable.ops._
// is it best practise to define a function like this for all constructor-like functions in the typeclass?
def deserialize[A:Encodable](bytes: Vector[Byte])(implicit instance: Encodable[A]): Try[A] = instance.deserialize(bytes)
// or def deserialize[A:Encodable](bytes: Vector[Byte]): Try[A] = Encodable[A].deserialize(bytes)
// call constructor
val value: Int = deserialize(Vector(1)).get
// call method
println(value.serialize)发布于 2018-03-07 21:18:51
对我来说,这太过分了。我喜欢的方式,以及我在其他代码库中看到的,只是:
val value: Int = Encodable[Int].deserialize(Vector(1)).get我不认为额外的deserialize方法会带来什么好处。我也看到:
val value: Int = implicitly[Encodable[Int]].deserialize(Vector(1)).get这对那些以前没见过假象的人来说可能更熟悉,但我不认为有这个必要。
https://stackoverflow.com/questions/49158994
复制相似问题