Что означает несколько последовательных жирных стрелок в параметрах метода в Scala?

Я понимаю, что метод может иметь такой код:

def m(p1:Int => Int) ...

Это означает, что этот метод принимает функцию p1, которая возвращает Int

Но при просмотре Play! Я нашел черту с неразборчивыми методами:

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))
  }
}

Играть! Scala Безопасность

Что означает f: User => Request[AnyContent] => Result? На первый взгляд это выглядит как метод, возвращающий функцию r типа Request; r затем возвращает a Result.

Это правильное предположение?

Ответ 1

Что означает f: User = > Request [AnyContent] = > Результат? На первый взгляд он выглядит как метод, возвращающий функцию r типа Request; r затем возвращает результат.

f возвращает функцию типа Request[AnyContent] => Result, то есть функцию, которая принимает Request[AnyContent] и возвращает a Result.

Другими словами f является кардной функцией. Вы можете назвать его f(user)(request), чтобы вернуть Result.

Ответ 2

def withAuth(f: => String => Request[AnyContent] => Result) означает, что f является параметром by-name, и вы можете написать что-то вроде этого:

withAuth {
  logger.info("Here we go")
  ...
  chooseTheAction("list")
}

где chooseTheAction принимает String и возвращает функцию, выполняющую запрос, Request[AnyContent] => Result