Я следующий кодScala вывод типа не в состоянии сделать вывод типов обобщенной функции
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)
})
HoldsMoney
и ReserveMoney
имеют базовый тип MoneyType
.
Компилятор Scala выдает следующую ошибку.
missing parameter type for expanded function
Обратите внимание, что это работает, если
x match {
case c: HoldsMoney => sendMoney(createHold(_: HoldsMoney), c)
case r: ReserveMoney => sendMoney(createReserve(_: ReserveMoney), r)
}
Nice. Но почему не общий тип как «MoneyType => Future [MoneyType]». У них есть общий базовый класс afterall –
@FaizHalde Ну, 'HoldsMoney <: MoneyType',' Future [HoldsMoney] <: Future [MoneyType] '(' Future' является ковариантным), но, как я уже говорил, 'Function' является контравариантным в своем типе аргументов, и поэтому 'HoldsMoney => Future [HoldsMoney]' НЕ является подтипом 'MoneyType => Future [MoneyType]'. Это может быть противоречиво, но на самом деле это естественно, когда вы об этом думаете. Также см. Этот вопрос: http://stackoverflow.com/questions/10603982/why-is-function-a1-b-not-about-allowing-any-supertypes-as-parameters – Kolmar
Да. Теперь путаница очищается! Благодарю. Кажется, мне немыслимо –