2

我正在尝试在启动 http 服务器时将多个端点组合在一起。多个端点定义如下:

  val foo = get("foo") { Ok("bar") }
  val test = get("test") { Ok("test") }

此代码正在运行

  foo :+: test

但是,此代码不起作用。

  List(foo, test).reduceLeft(_ :+: _)

错误是

 type mismatch;
 found   : io.finch.Endpoint[shapeless.:+:[String,shapeless.:+:[String,shapeless.CNil]]]
 required: io.finch.Endpoint[String]
 val controllers = List(foo, test).reduce(_ :+: _)
                                         ^

我不太明白为什么reduce不能在这里工作以及在 Finch 中结合 Endpoint 的最佳做法是什么

4

1 回答 1

3

为什么减少在这里不起作用

如果有x: Endpoint[String]y: Endpoint[String]x :+: y返回Endpoint[Coproduct[String, String]]1 - 重要的是它xor的类型不同y

看一下reduce2签名:

List[A].reduce[A1 >: A](op: (A1, A1) ⇒ A1): A1

你有一个List[Endpoint[String]]-op必须接受参数x: Endpoint[String]y: Endpoint[String]并返回Endpoint[String]- 但:+:会返回Endpoint[Coproduct[String, String]]

在 Finch 中结合 Endpoint 的最佳实践

我没有使用过 Finch,但 repo 中的所有示例都只是将端点与:+:

https://github.com/finagle/finch/blob/e3a62bf9a1cb26af40af428dd9be8b2dc3339c44/examples/src/main/scala/io/finch/todo/Main.scala#L83

getTodos :+: postTodo :+: deleteTodo :+: deleteTodos :+: patchTodo

如果您要在运行时操作元素,集合(如List)非常有用 - 这是您需要支持的用例吗?我通常发现我在编译时知道我的所有路线


Coproduct1.类型签名采取了一些自由-Coproduct[String, String]而不是shapeless.:+:[String, shapeless.:+:[String, shapeless.CNil]]

2. 类似的论点适用于reduceLeft

于 2016-06-05T03:25:24.880 回答