Shapeless на уровне типов: объединение элементов типа HList

Я хочу свернуть HList с этой монадой, но на уровне типа

trait TypeMonad{

  type Append[A,B] = A with B

  type Identity = Any
}

Следовательно, HList: "A :: B:: C :: HNil" даст тип "A with B with C with Any"

Это довольно легко сделать, если бы я реализовал HList:

sealed trait HList {
  type Fuse
}
final trait HCons[H,L<:HList] extends HList {
  type Fuse = H with L#Fuse
}
final trait HNil extends Hlist {
  type Fuse = Any
}

Однако я не знаю, как использовать эту функциональность в бесформенной среде.

Мой вариант использования следующий:

Мне нужно ограничить неявное использование класса определенным классом, ограничив допустимые параметры. Например:

trait Filter
trait IC1Filter extends Filter
trait IC2Filter extends Filter
(...)
implicit class IC1[T <: IC1Filter](val v : MyPrettyClass[T]){...}
implicit class IC2[T <: IC2Filter](val v : MyPrettyClass[T]){...}
(...)

например, если у меня есть

class MC extends MyClass[IC1Filter with IC3Filter with IC4Filter with Any]

MC должен анализироваться неявными классами IC1, IC3 или IC4, но не IC2 или IC5.

--

Я использую HList, состоящий из «Фильтров», для динамического определения параметра T. Когда нужный HList создан, мне нужно агрегировать компонент HList, чтобы создать анализируемые фильтры для неявных классов.

Итак, мне нужно, например:

 IC1FIlter :: IC3Filter :: IC4Filter :: HNil

быть преобразованным в

 IC1Filter with IC3Filter with IC4Filter with Any

person Coo LHibou    schedule 29.10.2013    source источник
comment
Ты уверен насчет этого? T with Nothing эквивалентно Nothing для всех T. Any было бы более полезно в качестве идентификатора относительно пересечения.   -  person Miles Sabin    schedule 30.10.2013
comment
@Miles Sabin Спасибо, вы только что решили мою ошибку! Однако я все еще не могу использовать его в вашей библиотеке, которая предоставляет все остальные необходимые мне функции. Если бы я получил это, я полагаю, что foldleft сделает свое дело. Однако я не понял, как реализовать это на уровне типа в бесформенном.   -  person Coo LHibou    schedule 30.10.2013
comment
Если вы обновите вопрос, чтобы отразить это, и привести пример того, как вы хотели бы использовать сгиб, я попытаюсь собрать для вас реализацию.   -  person Miles Sabin    schedule 30.10.2013
comment
@Miles Sabin, действительно, я должен был обновить напрямую, извините   -  person Coo LHibou    schedule 30.10.2013
comment
Спасибо, но мне все еще не ясно, что вы пытаетесь сделать: вам нужен перекресток (A, B и C) или объединение (A, B или C)?   -  person Miles Sabin    schedule 30.10.2013
comment
@MilesSabin Не уверен, что понимаю. Я хочу с конструктором... Я отредактировал вопрос, надеюсь, он должен быть понятен   -  person Coo LHibou    schedule 31.10.2013