Я хочу свернуть 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
T with Nothing
эквивалентноNothing
для всехT
.Any
было бы более полезно в качестве идентификатора относительно пересечения. - person Miles Sabin   schedule 30.10.2013