Использование границ вида с помощью scalaz


Я предпринимаю свой первый набег на 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 5

1 ответ:

Предполагается, что вы используете контекстную привязку, а не представление, связанное с ней.

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

Это известно как шаблон класса типа, и вы можете прочитать больше об этом здесь.