3

この Monad で 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 は、IC2 または IC5 ではなく、暗黙のクラス IC1 または IC3 または IC4 によって解析される必要があります

--

T パラメータを動的に定義するために、「フィルタ」で構成される HList を使用します。必要な HList が作成されたら、HList コンポーネントを集約して、暗黙的なクラスの解析可能なフィルターを生成する必要があります。

だから私は例えば必要です:

 IC1FIlter :: IC3Filter :: IC4Filter :: HNil

に変換されます

 IC1Filter with IC3Filter with IC4Filter with Any
4

0 に答える 0