Одна из новых возможностей Scala 2.8 - это контекстные границы. Что такое контекстная привязка и где это полезно?
Конечно, я сначала искал (и нашел, например, это ), но не смог найти действительно четкой и подробной информации.
scala
scala-2.8
context-bound
Джеспер
источник
источник
Ответы:
Вы нашли эту статью ? Он охватывает новую функцию привязки к контексту в контексте улучшений массивов.
Обычно параметр типа с контекстной привязкой имеет форму
[T: Bound]
; он расширяется до параметра простого типаT
вместе с неявным параметром типаBound[T]
.Рассмотрим метод,
tabulate
который формирует массив из результатов применения данной функции f к диапазону чисел от 0 до заданной длины. До Scala 2.7 табуляция могла быть записана следующим образом:В Scala 2.8 это больше невозможно, поскольку для создания правильного представления требуется информация времени выполнения
Array[T]
. Эту информацию необходимо предоставить, передавClassManifest[T]
в метод в качестве неявного параметра:В сокращенной форме вместо параметра типа можно использовать контекстную привязку
T
, давая:источник
Ответ Роберта охватывает технические детали ограничений контекста. Я дам вам свое толкование их значения.
В Scala View Bound (
A <% B
) отражает концепцию «можно рассматривать как» (тогда как верхняя граница<:
отражает концепцию «есть»). Функция context bound (A : C
) говорит о типе "имеет". Вы можете прочитать примеры манифестов как «T
имеетManifest
». Пример, на который вы ссылались aboutOrdered
vs,Ordering
иллюстрирует разницу. Методговорит, что параметр можно рассматривать как
Ordered
. Сравнить скоторый говорит, что параметр имеет связанный
Ordering
.С точки зрения использования, потребовалось время, чтобы установить соглашения, но границы контекста предпочтительнее границ представления ( границы представления теперь устарели ). Одно из предположений состоит в том, что привязка контекста предпочтительнее, когда вам нужно передать неявное определение из одной области в другую без необходимости ссылаться на нее напрямую (это, безусловно, относится к
ClassManifest
используемому для создания массива).Другой способ представления границ и границ контекста состоит в том, что первый передает неявные преобразования из области действия вызывающего объекта. Второй передает неявные объекты из области действия вызывающего.
источник
has a
Для меня больше смысла](Это примечание в скобках. Сначала прочтите и поймите другие ответы.)
Ограничения контекста фактически обобщают границы просмотра.
Итак, учитывая этот код, выраженный с помощью View Bound:
Это также может быть выражено с помощью Context Bound с помощью псевдонима типа, представляющего функции от типа
F
к типуT
.Привязка контекста должна использоваться с конструктором типа
* => *
. Однако конструкторFunction1
типа своего рода(*, *) => *
. Использование псевдонима типа частично применяет второй параметр типа к типуString
, давая конструктор типа правильного типа для использования в качестве привязки контекста.Есть предложение, позволяющее напрямую выражать частично применяемые типы в Scala без использования псевдонима типа внутри трейта. Затем вы можете написать:
источник
From
типа типаTo[String]
. Мы не предоставляем аргумент типаFrom
, поэтому мы ссылаемся на конструктор типа, а не на тип. Этот конструктор типа подходит для использования в качестве контекстной границы -* -> *
. Это ограничивает параметр типаT
, требуя неявного параметра типаTo[String]#From[T]
. Разверните псевдонимы типов, и вуаля, у вас остаетсяFunction1[String, T]
.Это еще одно примечание в скобках.
Как указал Бен , контекстная граница представляет собой ограничение типа «имеет-а» между параметром типа и классом типа. Другими словами, он представляет собой ограничение, согласно которому существует неявное значение определенного класса типа.
При использовании контекстной привязки часто требуется выявить это неявное значение. Например, при наличии ограничения
T : Ordering
часто требуется экземплярOrdering[T]
, удовлетворяющий этому ограничению. Как показано здесь , можно получить доступ к неявному значению с помощьюimplicitly
метода или чуть более полезногоcontext
метода:или
источник