我正在尝试在启动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结合起来的最佳做法是什么
答案 0 :(得分:3)
为什么减少不会在这里工作
如果您有url()
,x: Endpoint[String]
,则y: Endpoint[String]
会返回x :+: y
1 - 重要的是不是与Endpoint[Coproduct[String, String]]
或x
查看y
2 签名:
reduce
您有List[A].reduce[A1 >: A](op: (A1, A1) ⇒ A1): A1
- List[Endpoint[String]]
必须接受参数op
,x: Endpoint[String]
并返回y: Endpoint[String]
- 但Endpoint[String]
将返回{ {1}}
在Finch中结合Endpoint的最佳做法
我还没有使用过Finch,但是repo中的所有示例都只是将端点与:+:
Endpoint[Coproduct[String, String]]
如果您要在运行时操作元素,那么集合(如:+:
)非常有用 - 您需要支持的用例吗?我通常发现我在编译时知道所有路线
<子> 1。使用getTodos :+: postTodo :+: deleteTodo :+: deleteTodos :+: patchTodo
类型签名进行了一些自由 - List
而不是Coproduct
<子> 2。类似的论点适用于Coproduct[String, String]