Как объединить несколько конечных точек в зяблике
Я пытаюсь составить несколько конечных точек вместе при запуске 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, но все примеры в репозитории просто объединяют конечные точки с :+:
getTodos :+: postTodo :+: deleteTodo :+: deleteTodos :+: patchTodo
Коллекции (как List
) очень полезны, если вы собираетесь манипулировать элементами во время выполнения - это тот случай использования, который вам нужно поддерживать? Обычно я обнаружил, что знаю все свои маршруты во время компиляции
1. Некоторые свободы были взяты с Coproduct
тип подписи - Coproduct[String, String]
скорее, чем shapeless.:+:[String, shapeless.:+:[String, shapeless.CNil]]
2. Аналогичный аргумент верен для reduceLeft