Использование представления границ со скалязом - PullRequest
5 голосов
/ 21 сентября 2011

Я переношу свой первый набег в скаляр, преобразовав существующий класс в черту Моноид .То, чего я пытаюсь добиться, - это установить представление для моего параметра типа класса, чтобы гарантировать его использование только с типами, которые могут быть неявно преобразованы в 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 в черту, и это сработало нормально.

Чего мне не хватает сейчас, когда я преобразовал это в скаляр?

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

1 Ответ

9 голосов
/ 21 сентября 2011

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

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

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

...