scala – 使用隐式证人组合类型级函数
发布时间:2020-12-16 18:02:06 所属栏目:安全 来源:网络整理
导读:我正在尝试一些相当复杂的类型级计算.在那里,我有一些类型标签(比如A,B和C),以及处理它们的函数,它们由具有路径依赖结果类型的隐式见证表示: class Aclass Bclass Ctrait F1[T] { type result }trait F2[T] { type result }implicit object f1OfA extends F
我正在尝试一些相当复杂的类型级计算.在那里,我有一些类型标签(比如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 } 在计算过程中,当“实现”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]]的证人?如果有必要,我也可以改变编写类型级函数的方式,但我还没有找到另一种方式来表达它们. 解决方法
您使用另一个类型参数,然后需要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 } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |