Я на самом деле использую неявный подход (используя классы типов), который вы описываете в библиотеке Scala ARM . Помните, что это ручное решение проблемы.
Самая большая проблема здесь - неявное разрешение. Компилятор не будет создавать оболочки для вас на лету, вы должны сделать это заранее и убедиться, что они являются неявной областью действия. Это означает (для Scala-ARM), что мы предоставляем «общую» оболочку для любых ресурсов, которые мы можем, и прибегаем к типам на основе отражения, когда мы не можем найти подходящую оболочку. Это дает преимущество, позволяя пользователю указывать свою собственную оболочку, используя обычные неявные правила.
См .: Характеристика типа ресурса и все его предопределенные оболочки.
Кроме того, я написал в блоге об этой технике, описывающей магию неявного разрешения более подробно: Patching Monkey, Duck Typing и Классы типов .
В любом случае, вы, вероятно, не хотите вручную кодировать класс типов каждый раз, когда используете структурные типы. Если вы действительно хотите, чтобы компилятор автоматически создал интерфейс и сделал для вас чудеса, он может запутаться. Каждый раз, когда вы определяете структурный тип, компилятор должен будет создать для него интерфейс (возможно, где-нибудь в эфире?). Теперь нам нужно добавить пространства имен для этих вещей. Кроме того, при каждом вызове компилятор должен генерировать некоторый класс реализации-оболочки (опять же с проблемой пространства имен). Наконец, если у нас есть два разных метода с одним и тем же структурным типом, которые компилируются отдельно, мы только что разбили количество необходимых нам интерфейсов.
Не то чтобы препятствие не могло быть преодолено, но если вы хотите использовать структурную типизацию с «прямым» доступом для определенных типов, шаблон «тип-черта», похоже, будет вашей лучшей ставкой сегодня.