6 } 但这-6ren">
gpt4 book ai didi

scala - FnToProduct 不适用于类型构造函数

转载 作者:行者123 更新时间:2023-12-01 00:37:18 26 4
gpt4 key购买 nike

为什么这按预期工作:

def method1[L <: HList, M <: HList, F, R](list: L)(builder: F)
(implicit ev: Comapped.Aux[L, Seq, M],
fntp: FnToProduct.Aux[F, M => R]) = println("asd")

method1(Seq("asd") :: HNil) { (s: String) =>
6
}

但这不?
def method2[L <: HList, M <: HList, F, R](list: L)(builder: F)
(implicit ev: Comapped.Aux[L, Seq, M],
fntp: FnToProduct.Aux[F, M => Seq[R]]) = println("asd")

method2(Seq("asd") :: HNil) { (s: String) =>
Seq(6)
}

似乎在 FnToProduct.Aux 的返回类型中添加类型构造函数会破坏它。

最佳答案

问题是当编译器试图推断 method1 的类型参数时,它会找到 LMF没有问题,但是当它到达 R 时它无法判断 FnToProduct.Aux 的第二个参数有合适的形状来搭配 M => Seq[R] .

在我的脑海中,我无法很好地解释为什么会在第二种情况下而不是第一种情况下发生这种情况,但这是您经常遇到的限制,并且有几种解决方法。

第一个是离开 Aux关闭 FnToProduct共。根据您的实际方法在做什么,这可能没问题,但如果您需要引用 R显然它不会起作用。

第二种解决方法是让第二个类型参数的返回类型被推断出来,然后要求提供它是 Seq 的证据。 :

import shapeless._, ops.function.FnToProduct, ops.hlist.Comapped

def method2[L <: HList, M <: HList, F, S, R](list: L)(builder: F)
(implicit
ev: Comapped.Aux[L, Seq, M],
fntp: FnToProduct.Aux[F, M => S],
s: S <:< Seq[R]
) = println("asd")

method2(Seq("asd") :: HNil) { (s: String) => Seq(6) }

这有点额外的语法噪音,但它有效。

关于scala - FnToProduct 不适用于类型构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39963173/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com