2016-06-02 4 views
2

Отказ от ответственности: Я не уверен, что я действительно понимаю границы контекста шрифта ... или что-то еще.Любое с привязкой к контуру

Возможно ли определить тип в scala, который является экземпляром TypeClass, где тип может быть Any, если этот тип подчиняется привязке к типу типа.

Например, у меня есть класс типов Printable[T]

печать является классом типов для вещей, которые могут быть напечатаны, и это полезно в качестве контекста типа, связанного, потому что я мог бы иметь класс типов, которые могут принимать любой тип до тех пор, как это версия для печати, например:

class SomeContainer[T: Printable](value: T) 

Из того, что я понимаю библиотеку коллекций использует контекст типа ограничивающий, как это для вещей, которые можно заказать, суммируется и т.д.

Но что я хочу type PrintableAnyCollection = SomeCollection[_: Printable]

Это набор значений, которые могут быть разных типов, если все эти типы подчиняются типу привязки к тексту, что существует Printable[T] для w/e этого типа.

TLDR:

Collection[Any] почти делает то, что я хочу, потому что он может содержать различные типы

Collection[T: Printable] Почти делает то, что я хочу, потому что навязывает, что вещи в коллекции печати, но приводит к тому, что сбор хранит только один тип.

Collection[_: Printable] и/или Collection[Any: Printable] выглядят как они описывают то, что я хочу, но не являются допустимыми синтаксисом.

ответ

1

Вы, вероятно ищете что-то вроде этого:

// Doesn't work 
Collection[T forSome {type T: Printable}] 

Это не работает, хотя и причина в том, что контекст оценки являются только сахар для неявных параметров, которые разрешены во время компиляции. В частности, вышеупомянутый тип подразумевал бы, что неявные разрешения, сделанные компилятором, будут зависеть от значения времени выполнения вышеуказанного типа (каждому другому T потребуется другое неявное разрешение). По сути, вы должны создать метод, чья ясность в его неявном списке параметров может измениться во время выполнения.

Достаточно сказать, что с Scala не играет хорошо.

Альтернативой является проактивное связывание неявного параметра в каком-то типе типа обертки и параметризация вашей коллекции в оболочке как экзистенциальная. Таким образом, неявное разрешение возникает до создания коллекции. Майлз Сабин хорошо ее использует here.

Чтобы кратко резюмировать, что подход, это выглядит примерно так:

case class PrintableWrapper[T](unwrap: T)(implicit ev: Printable[T]) 

Collection[PrintableWrapper[T] forSome {type T}] 

На самом деле, используя запись из коллекции является громоздким (поддельным матч шаблона должен умиротворить проверки типов в Scala). Для дескрипции контекста также требуется наличие явного экземпляра Printable для фактической печати записи. См. Ответ Майлза Сабина для более подробной информации.

Это одно место, где implicits - немного громоздкий способ кодирования типов.

+0

Этот ответ в конечном итоге заставил меня задать гораздо больше вопросов, но в конечном итоге привел к мне приемлемое решение. Другой поток, с которым вы связались, - отличное обсуждение более широкой проблемы ограничений контекста в гетерогенном списке в Scala. В конечном итоге я решил свою проблему, отказавшись от typeclasses и используя подтипирование, которое было очень неэлегантным, потому что библиотека, с которой я взаимодействую, использует классы типов, и поэтому мне нужна куча прокладок, но с использованием классов типов с классами классов и наследованием просто полностью взорвал мой бюджет сложности. – jangoolie

Смежные вопросы