I have a piece of code that I can't get to behave in the way I'd like. I have a class defined in the following way (stripped down for this):
class Behaviour[T](private val rule: Time => T) {
def map1[U, V](behaviour: Behaviour[U], func: (T, U) => V): Behaviour[V] = {
new Behaviour(time => func(this.at(time), behaviour.at(time)))
}
}
When playing around with this class I tried to something that I thought would be trivial:
val beh = Behaviour(time => 5)
val beh2 = Behaviour(time => 5)
beh.map1(beh2, (a, b) => a + b)
For the last line I receive the following error:
<console>:13: error: missing parameter type
beh.map1(beh2, (a, b) => a + b)
^
I can of course specify the closure parameter types and it works correctly but why doesn't type inference work here? Of course I could also specify the generic types for the function (see below for both solutions).
I thought Scala carried out a 'scan' to infer types and would see beh2
and passed into the function and assume U
here to be Int
. Is there some way I can fix this without specify the types of the input parameters (for the closure or the generics)?
EDIT: Examples of the two fixes I have:
beh.map1[Int, Int](beh2, (a, b) => a + b)
beh.map1(beh2, (a, b : Int) => a + b)
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…