使用隐式证人组合类型级函数

时间:2015-06-04 13:34:30

标签: scala type-systems implicits path-dependent-type type-level-computation

我正在尝试一些相当复杂的类型级计算。在那里,我有一些类型标记(比如,ABC),以及处理它们的函数,它们由具有路径依赖结果类型的隐式见证表示: / p>

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,我需要利用这样一个事实,即根据上述代码,我可以原则上将A转换为C(在这个例子中,我只需要组合,但实际上还有更多的事情。)

然而,我不知道如何表达构图,因为我总是受限于不能传递的含义;以下代码失败,其中"隐式未找到":

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]]的见证人?如果有必要,我也可以改变编写类型级函数的方式,但我还没有找到另一种方式来表达它们。

1 个答案:

答案 0 :(得分:5)

您使用其他类型参数,然后需要[IgnoreDataMember] public virtual Employee Employee { get; set; }

f1OfX.result