5

我通过将现有类转换为使用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,我错过了什么?

谢谢,克里斯

4

1 回答 1

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])

This is known as type class pattern and you can read more about it here.

于 2011-09-21T18:39:13.483 回答