4

我正在尝试一些相当复杂的类型级计算。在那里,我有一些类型标签(比如 、ABC和处理它们的函数,它们由具有路径相关结果类型的隐式见证表示:

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 }

在计算的过程中,“实现”的时候Composed,我需要利用我可以,给定上面的代码,原则上可以转换AC(在这个例子中,我只需要组合,但实际上涉及的东西更多) .

但是,我不知道如何表达构图,因为我总是受到隐含不能传递的限制;以下代码因“未找到隐式”而失败:

implicit def composed1[X](implicit f2DotF1OfX: F2[F1[X]]): Composed[X] =  
  new Composed[X] { type result = f2DotF1OfX.result }

implicitly[Composed[C]]

我最初尝试写的是以下内容:

implicit def composed2[X](implicit f1OfX: F1[X], f2OfLast: F2[f1OfX.result]): Composed[X] =
  new Composed[X] { type result = f2OfLast.result }

这当然失败了,因为我f1OfLast在它定义的同一个参数列表中使用了它。如果它不是隐式参数,我可以写

implicit def composed3a[X](f1OfX: F1[X])(f2OfLast: F2[f1OfX.result]): Composed[X] =
   new Composed[X] { type result = f2OfLast.result }

但是不可能使用两个隐式参数列表来做到这一点,因为它们是语言不允许的。


简而言之:我怎样才能F2[F1[X]]在上面的例子中得到证人?如有必要,我也可以改变编写类型级函数的方式,但我还没有找到另一种表达方式。

4

1 回答 1

5

您使用另一个类型参数,然后要求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 }
于 2015-06-04T14:08:28.413 回答