根据样式指南,在Scala中应该使用什么来表示类型类,是"上下文界定"还是"隐式证明"符号?这两个例子的功能相同。上下文界定具有更简洁的函数签名,但需要通过implicitly调用来评估val。
def empty[T: Monoid, M[_] : Monad]: M[T] = {
val M = implicitly[Monad[M]]
val T = implicitly[Monoid[T]]
M.point(T.zero)
}
implicit ev
方法会自动将类型类插入函数参数,但是会污染方法签名:
def empty[T, M[_]](implicit T: Monoid[T], M: Monad[M]): M[T] = {
M.point(T.zero)
}
我查看过大部分库(例如"com.typesafe.play" %% "play-json" % "2.6.2"
)都使用implicit ev
你们在用什么,为什么选择这个?
apply
方法的方式真的很好,我看了这篇文章。不过在scalaz
的类型类中没有找到。 - Eugene Zhulkovimplicitly
被注释为@inline
,但Scala编译器似乎没有将其内联到生成的字节码中。因此,内联必须由JIT完成。Dotty的inline
关键字应该可以解决这个问题。 - Joe Pallas