Использование границ вида с помощью 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 ответ:
Предполагается, что вы используете контекстную привязку, а не представление, связанное с ней.
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])
Это известно как шаблон класса типа, и вы можете прочитать больше об этом здесь.