Scala类型推断无法推断泛型函数的类型

时间:2017-01-13 09:31:15

标签: scala generics types tuples partialfunction

我有以下代码

def sendMoney[T <: MoneyType](fn: T => Future[T], input: T): Unit

以这种方式调用

case x: Any => (sendMoney(_, _).tupled(x match {
  case c: HoldsMoney => (createHold(_: HoldsMoney), c: HoldsMoney)
  case r: ReserveMoney => (createReserve(_: ReserveMoney), r: ReserveMoney)
})

HoldsMoneyReserveMoney的基本类型为MoneyType

Scala编译器抛出以下错误。

missing parameter type for expanded function

注意,如果

,则有效
x match {
  case c: HoldsMoney => sendMoney(createHold(_: HoldsMoney), c)
  case r: ReserveMoney => sendMoney(createReserve(_: ReserveMoney), r)
}

2 个答案:

答案 0 :(得分:3)

考虑

的类型
x match {
  case c: HoldsMoney => (createHold(_: HoldsMoney), c: HoldsMoney)
  case r: ReserveMoney => (createReserve(_: ReserveMoney), r: ReserveMoney)
}

createHold(_: HoldsMoney)的类型为HoldsMoney => Future[HoldsMoney]createReserve(_: ReserveMoney)的类型为ReserveMoney => Future[ReserveMoney]

因为函数在其参数类型中是逆变的,所以这两个函数的通用类型只能是Nothing => Future[MoneyType]。因此整个match的类型是(Nothing => Future[MoneyType], MoneyType),它不符合sendMoney的参数类型。

所以问题是对于sendMoney的不同组合的参数,不可能有一个合适的公共类型。

答案 1 :(得分:0)

我认为您的目标是为sendMoney重构参数创建并使用tupled传递它们。 我想你的代码缺少部分,并为简单起见删除了类型边界。

def sendMoney(fn: (MoneyType) => Future[MoneyType], input: MoneyType): Unit = println("sendMoney")

def createHold(moneyType: MoneyType): Future[MoneyType] = ???
def createReserve(moneyType: MoneyType): Future[MoneyType] = ???

(sendMoney _).tupled(x match {
  case c: HoldsMoney => (createHold, c)
  case r: ReserveMoney => (createReserve, r)
})