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 でエンドポイントを組み合わせるベストプラクティスは何なのかよくわかりません

4

1 に答える 1

3

reduce がここで機能しない理由

の場合は1を返します- 重要なことにx: Endpoint[String]y: Endpoint[String]それはまたはと同じタイプではありません。x :+: yEndpoint[Coproduct[String, String]]xy

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 でエンドポイントを組み合わせるベスト プラクティス

私は Finch を使用していませんが、リポジトリ内のすべての例は、単にエンドポイントを:+:

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 に答える