gpt4 book ai didi

Scala 没有推断出适当的方法

转载 作者:行者123 更新时间:2023-12-04 15:13:43 25 4
gpt4 key购买 nike

我有以下方法

def show[E: Writes, T: Writes](block: RequestWithUser[AnyContent] => Either[E, T]): Action[AnyContent] = {
withErr(block)
}

我从 Controller 中这样使用它:
def show(id: Long) = CrudAuthAction.show { request =>
IdeaType.findByIdWithErr(id)
}

我希望请求方法是可选的,所以我为相同的方法定义了另一个签名:
def show[E: Writes, T: Writes](block: => Either[E, T]): Action[AnyContent] = {
withErr(request => block)
}

它工作正常,我可以省略请求参数

但是当我尝试用另一种方法做同样的事情时
def list[T: Writes](block: RequestWithUser[AnyContent] => T): Action[AnyContent] = {
fromRequest(block)
}

def list[T: Writes](block: => T): Action[AnyContent] = {
fromRequest(request => block)
}

当我想像这样使用它时:
def list = CrudAuthAction.list { request =>
IdeaType.find(request.queryString)
}

它告诉我请求缺少参数类型,我必须像这样指定它:
def list = CrudAuthAction.list { request: RequestWithUser[AnyContent] =>

我看不出与第一种情况有什么不同,但 Scala 似乎无法推断出正确的请求类型......

我看到的唯一区别是,在第一种情况下,块返回一个任一 [E,T],但在第二种情况下只返回一个通用的 T...

最佳答案

问题是在第二个例子中,编译器不知道选择哪个重载方法,因为 T 很可能是一个函数类型。自 Either显然不是函数,它适用于第一种情况。

要解决此问题,您可以将第二种方法更改为

def list[T: Writes](block: => Foo[T]): Action[AnyContent] = {
fromRequest(request => block.v)
}

Foo 定义如下:
case class Foo[T](val v:T)

不幸的是,向 Foo 添加隐式转换会再次破坏事情,除非您为 Writes 中的每种类型创建一个隐式转换类型类。

关于Scala 没有推断出适当的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13153306/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com