使用带有scalaz的视图边界

时间:2011-09-21 18:01:03

标签: scala scalaz

我通过将现有的类转换为使用 Monoid 特征来进行scalaz的第一次尝试。我想要实现的是在我的类类型参数上设置一个视图绑定,以确保它只能用于可以隐式转换为Monoid的类型。因此,我的(简化的)类定义是:

import scalaz._
import Scalaz._

case class Foo[T <% Monoid[T]](v: T)

new Foo(42)

编译这个简单的例子会给编译器错误:

error: No implicit view available from Int => scalaz.Monoid[Int].

以前,这个视图绑定是根据我自己的自定义特征定义的,具有从T到特征的隐式转换,这很好。

我现在将这个转换为scalaz,我错过了什么?

谢谢, 克里斯

1 个答案:

答案 0 :(得分:9)

您应该使用上下文绑定,而不是绑定的视图。

import scalaz._
import Scalaz._

case class Foo[T : Monoid](v: T)

new Foo(42)

T : Monoid表示法意味着范围内存在隐式类型Monoid[T]。事实上,它贬低了以下内容:

case class Foo[T](v: T)(implicit ev: Monoid[T])

这称为类型类模式,您可以阅读更多相关信息here