Scala使用()应用PartialFunction与.apply()不同

Scala使用()应用PartialFunction与.apply()不同,scala,compiler-errors,partialfunction,Scala,Compiler Errors,Partialfunction,我正试图在一个项目(Play Framework 2.4)中重构scala代码,当时我想到了以下想法: (为了提供一个简单的工作示例,我更改了一些类,例如,我分别使用Int和Option[Int]更改了Result和Future[Result]) 上面的代码可以编译 然后我想:我应该将fold[T]参数化类型限制为Int和Option[Int],所以我添加了: object ParFuncApply { trait CanBeAuthenticatedRequest[A] trait

我正试图在一个项目(Play Framework 2.4)中重构scala代码,当时我想到了以下想法:

(为了提供一个简单的工作示例,我更改了一些类,例如,我分别使用Int和Option[Int]更改了Result和Future[Result])

上面的代码可以编译

然后我想:我应该将fold[T]参数化类型限制为Int和Option[Int],所以我添加了:

object ParFuncApply {

  trait CanBeAuthenticatedRequest[A]
  trait AuthenticatedRequest[A] extends CanBeAuthenticatedRequest[A]
  trait UnauthenticatedRequest[A] extends CanBeAuthenticatedRequest[A]

  sealed trait Helper[T]

  object Helper {
    implicit object FutureResultHelper extends Helper[Option[Int]]
    implicit object ResultHelper extends Helper[Int]
  }

  private def fold[T: Helper](authenticated: (AuthenticatedRequest[_]) => T)
                             (unauthenticated: (UnauthenticatedRequest[_]) => T):
  PartialFunction[CanBeAuthenticatedRequest[_], T] = {
    case ar: AuthenticatedRequest[_] => authenticated(ar)
    case ur: UnauthenticatedRequest[_] => unauthenticated(ur)
  }

  def apply(request: CanBeAuthenticatedRequest[_])
           (authenticated: (AuthenticatedRequest[_]) => Int)
           (unauthenticated: (UnauthenticatedRequest[_]) => Int): Int = {
    fold(authenticated)(unauthenticated)(request)
  }

  def async(request: CanBeAuthenticatedRequest[_])
           (authenticated: (AuthenticatedRequest[_]) => Option[Int])
           (unauthenticated: (UnauthenticatedRequest[_]) => Option[Int]): Option[Int] = {
    fold(authenticated)(unauthenticated)(request)
  }
}
但如果我更改以下内容,则此代码不再编译:
fold(authenticated)(unauthenticated)(request)
fold(authenticated)(unauthenticated)。apply(request)
(我为apply()添加了一个显式调用)它编译。为什么会这样?对类调用()和.apply()应该是一样的,不是吗


编译器似乎要求将返回类型(Int或选项[Int])传递给PartialFunction,而不是CanBeAuthenticatedRequest类型。

因为您在“fold[T:Helper]”中定义了上下文绑定,编译器将添加另一个参数列表。换言之,上下文绑定只是以下方面的语法糖:

private def fold[T](authenticated: (AuthenticatedRequest[_]) => T)
                   (unauthenticated: (UnauthenticatedRequest[_]) => T)
                   (implicit helper: Helper[T): PartialFunction[CanBeAuthenticatedRequest[_], T] 
所以当你打电话的时候

fold(authenticated)(unauthenticated)(request)

编译器认为
request
应该是一个显式指定的隐式Helper[T]。

@vicaba另外,与调用
apply
不同,另一个常见的解决方法是在调用val之前先将部分函数分配给val。例如
val f=fold(已验证)(未验证)
f(请求)
fold(authenticated)(unauthenticated)(request)