我正在尝试一些相当复杂的类型级计算。在那里,我有一些类型标记(比如,A
,B
和C
),以及处理它们的函数,它们由具有路径依赖结果类型的隐式见证表示: / 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]]
的见证人?如果有必要,我也可以改变编写类型级函数的方式,但我还没有找到另一种方式来表达它们。
答案 0 :(得分:5)
您使用其他类型参数,然后需要[IgnoreDataMember]
public virtual Employee Employee { get; set; }
:
f1OfX.result