gpt4 book ai didi

scala - 在 akka http 路由列表上调用 reduce 会产生编译错误(参数连接没有隐式值)

转载 作者:行者123 更新时间:2023-12-04 21:32:59 25 4
gpt4 key购买 nike

鉴于以下路线

val route1: PathMatcher[Unit] = PathMatcher("app")
val route2: PathMatcher1[String] = PathMatchers.Segment
val route3: PathMatcher[Unit] = PathMatcher("lastSegment")

我可以轻松定义
val resultingRoute: PathMatcher[Tuple1[String]] = route1 / route2 / route3

获得预期的类型(PathMatcher[Tuple[String]])。

但是以编程方式创建路线,例如
val routeDef = List(route1, route2, route3)
val resultingRoute = routeDef.reduce((a,b) => a / b)

不会编译,给我

could not find implicit value for parameter join: akka.http.scaladsl.server.util.TupleOps.Join[_1,_1]



此外,resultsRou​​te 的推断类型是
PathMatcher[_ >: Unit with Tuple1[String] with join.Out]

我真的很感激任何提示,让我知道我在这里做错了什么或如何解决这个问题。

为了完整起见,这是我的进口:
import akka.http.scaladsl.server.Directives._
import akka.http.scaladsl.server.{PathMatcher, _}

非常感谢!

最佳答案

您的问题是您的 routeDef list 实际上是异构的,编译器推断它的类型是 List[PathMatcher[_ >: Tuple1[String] with Unit]] .

鉴于此,(a: PathMatcher[L])./(b: PathMatcher[R])方法需要隐含一个 TupleOps.Join[L, R] :akka.http.scaladsl.server.PathMatcher .不能从PathMatcher推断出来您的 routeDef 中的 s 类型列表。

如果您愿意使用 shapeless 然后,您可以轻松处理异构列表(在此上下文中称为 HList s):

import shapeless._

val routeDef = route1 :: route2 :: route3 :: HNil
object join extends Poly {
implicit def casePathMatcher[A, B](
implicit t: akka.http.scaladsl.server.util.TupleOps.Join[A,B]
) = use((a: PathMatcher[A], b: PathMatcher[B]) => a/b)
}

val resultingRoute: PathMatcher[Tuple1[String]] = routeDef.reduceLeft(join)

关于scala - 在 akka http 路由列表上调用 reduce 会产生编译错误(参数连接没有隐式值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46789448/

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