在Scala中,方法参数中的多个连续fat箭头意味着什么?

在Scala中,方法参数中的多个连续fat箭头意味着什么?,scala,playframework,playframework-2.0,Scala,Playframework,Playframework 2.0,我知道一个方法可以有如下代码: def m(p1:Int => Int) ... withAuth { logger.info("Here we go") ... chooseTheAction("list") } 这意味着该方法接受一个返回Int的函数p1 但是在浏览剧本的时候!框架代码我发现了一个无法识别的特征: trait Secured { def username(request: RequestHeader) = request.session.get(S

我知道一个方法可以有如下代码:

def m(p1:Int => Int) ...
withAuth {
  logger.info("Here we go")
  ...
  chooseTheAction("list")
}
这意味着该方法接受一个返回Int的函数p1

但是在浏览剧本的时候!框架代码我发现了一个无法识别的特征:

trait Secured {

  def username(request: RequestHeader) = request.session.get(Security.username)

  def onUnauthorized(request: RequestHeader) = Results.Redirect(routes.Auth.login)

  def withAuth(f: => String => Request[AnyContent] => Result) = {
    Security.Authenticated(username, onUnauthorized) { user =>
      Action(request => f(user)(request))
    }
  }

  /**
   * This method shows how you could wrap the withAuth method to also fetch your user
   * You will need to implement UserDAO.findOneByUsername
   */
  def withUser(f: User => Request[AnyContent] => Result) = withAuth { username => implicit request =>
    UserDAO.findOneByUsername(username).map { user =>
      f(user)(request)
    }.getOrElse(onUnauthorized(request))
  }
}

f:User=>请求[AnyContent]=>结果是什么意思?乍一看,它看起来像是一个返回Request类型的函数
r
r
然后返回
结果

这是正确的假设吗

f:User=>Request[AnyContent]=>Result是什么意思?乍一看,它看起来像是一个返回Request类型的函数r的方法;r然后返回一个结果

f
返回类型为
请求[AnyContent]=>结果的函数,即接受
请求[AnyContent]
并返回
结果的函数

换句话说,
f
是一个通用函数。您可以将其称为
f(user)(request)
以获取
结果
def withAuth(f:=>String=>request[AnyContent]=>Result)
意味着
f
是一个按名称的参数,您可以这样编写:

def m(p1:Int => Int) ...
withAuth {
  logger.info("Here we go")
  ...
  chooseTheAction("list")
}

其中,
chooseTheAction
获取一个
字符串
并返回一个执行请求的函数,
request[AnyContent]=>Result

好,没问题。但为什么需要具体说明这一点?为什么编译器不能推断
Request
返回的类型?编辑:没关系,我想请求的子类型可能会返回不同类型的结果,所以这很有帮助。@CameronA.Ellis我不太确定我是否理解您的评论。
请求
对象不返回任何内容。
f
返回的函数,其类型为
Request[AnyContent]=>Result
返回一个
Result
。返回类型不能被排除在函数的类型之外,因为它看起来像是
f
返回的
请求
对象-而不是接受
请求
对象的函数,这是完全不同的。