phi*_*ler 4 type-systems scala path-dependent-type implicits type-level-computation
我正在尝试一些相当复杂的类型级计算.在那里,我有一些类型的标签(比如A,B和C),和功能对他们的工作,这是由与路径依赖的结果类型隐目击者表示:
class A
class B
class C
trait F1[T] { type result }
trait F2[T] { type result }
implicit object f1OfA extends F1[A] { type result = B }
implicit object f2OfB extends F2[B] { type result = C }
trait Composed[T] { type result }
Run Code Online (Sandbox Code Playgroud)
在计算过程中,当"实现"时Composed,我需要利用这样一个事实:在给定上述代码的情况下,原则上可以转换A为C(在这个例子中,我只需要组合,但实际上还有更多的事情涉及) .
但是,我不知道如何表达构图,因为我总是受到限制的限制,暗示不是传递性的; 以下代码失败,显示"隐式未找到":
implicit def composed1[X](implicit f2DotF1OfX: F2[F1[X]]): Composed[X] =
new Composed[X] { type result = f2DotF1OfX.result }
implicitly[Composed[C]]
Run Code Online (Sandbox Code Playgroud)
我最初尝试写的内容如下:
implicit def composed2[X](implicit f1OfX: F1[X], f2OfLast: F2[f1OfX.result]): Composed[X] =
new Composed[X] { type result = f2OfLast.result }
Run Code Online (Sandbox Code Playgroud)
这当然失败了,因为我f1OfLast在相同的参数列表中使用了它.如果它不是隐式参数,我可以写
implicit def composed3a[X](f1OfX: F1[X])(f2OfLast: F2[f1OfX.result]): Composed[X] =
new Composed[X] { type result = f2OfLast.result }
Run Code Online (Sandbox Code Playgroud)
但是使用两个隐式参数列表是不可能的,因为它们不被语言所禁止.
简而言之:我怎样才能F2[F1[X]]在上面的例子中得到证人?如果有必要,我也可以改变编写类型级函数的方式,但我还没有找到另一种方式来表达它们.
您使用另一个类型参数,然后要求f1OfX.result:
implicit def composed4[X, Y](implicit f1OfX: F1[X] { type result = Y },
f2OfLast: F2[Y]): Composed[X] =
new Composed[X] { type result = f2OfLast.result }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
160 次 |
| 最近记录: |