Использование границ представления с помощью 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?

Спасибо, Крис


person Chris Turner    schedule 21.09.2011    source источник


Ответы (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])

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

person missingfaktor    schedule 21.09.2011
comment
Блестящий. Спасибо за вашу помощь. Знал, что это что-то очевидное. Спасибо за ссылку - хорошее чтение на потом. - person Chris Turner; 21.09.2011