Как объединить несколько конечных точек в зяблике

Я пытаюсь составить несколько конечных точек вместе при запуске 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 не будет работать здесь, и какова лучшая практика для объединения Endpoint в Finch

1 ответ

почему уменьшить не будет работать здесь

Если у вас есть x: Endpoint[String], y: Endpoint[String] затем x :+: y возвращает Endpoint[Coproduct[String, String]] 1 - важно, что это не тот же тип, что и x или же y

Посмотрите на reduce 2 подписи:

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]]

Лучшая практика для объединения Endpoint в Finch

Я не использовал Finch, но все примеры в репозитории просто объединяют конечные точки с :+:

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

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

Коллекции (как List) очень полезны, если вы собираетесь манипулировать элементами во время выполнения - это тот случай использования, который вам нужно поддерживать? Обычно я обнаружил, что знаю все свои маршруты во время компиляции


1. Некоторые свободы были взяты с Coproduct тип подписи - Coproduct[String, String] скорее, чем shapeless.:+:[String, shapeless.:+:[String, shapeless.CNil]]

2. Аналогичный аргумент верен для reduceLeft

Другие вопросы по тегам