Home > Net >  Scala, why can't underscore function syntax infer type?
Scala, why can't underscore function syntax infer type?

Time:07-26

I'm new to scala and I've stumbled upon some weird cases where type inference does not work as expected. for example, this does not compile:

List(1, 2, 3, 4, 5, 6)
    .map(if _ > 3 then "foo" else "bar")

the compiler explicitly states it can't infer the type of _$1 which I take to be the first parameter of the function the syntax above desugars to.

somewhat frustratingly, the below code compiles just fine, even with no type annotation:

List(1, 2, 3, 4, 5, 6)
    .map{ n => if n > 3 then "foo" else "bar"}

clearly there's something I'm not grasping about how _ desugars. can somebody clue me in on what's missing?

CodePudding user response:

You are missing parenthesis:

List(1, 2, 3, 4, 5, 6)
    .map(if (_) > 3 then "foo" else "bar")

See it working for Scala 3.

Or more "canonical" version working both for Scala 3 and Scala 2 and mentioned in Scala 2.11 spec:

placeholder syntax. equivalent anonymous function
_ 1 x => x 1
_ * _ (x1, x2) => x1 * x2
(_: Int) * 2 (x: Int) => (x: Int) * 2
if (_) x else y z => if (z) x else y
_.map(f) x => x.map(f)
_.map( _ 1) x => x.map(y => y 1)
List(1, 2, 3, 4, 5, 6)
  .map(_ > 3)
  .map(if (_) "foo" else "bar")
  • Related