Search code examples
scalatuplespartialfunction

Using Tuples in map, flatmap,... partial functions


If I do:

val l = Seq(("un", ""), ("deux", "hehe"), ("trois", "lol"))
l map { t => t._1 + t._2 }

It's ok.

If I do:

val l = Seq(("un", ""), ("deux", "hehe"), ("trois", "lol"))
l map { case (b, n) => b + n }

It's ok too.

But if I do:

val l = Seq(("un", ""), ("deux", "hehe"), ("trois", "lol"))
l map { (b, n) => b + n }

It will not work.
Why should I use "case" keyword to use named tuples?


Solution

  • The error message with 2.11 is more explanatory:

    scala> l map { (b, n) => b + n }
    <console>:9: error: missing parameter type
    Note: The expected type requires a one-argument function accepting a 2-Tuple.
          Consider a pattern matching anonymous function, `{ case (b, n) =>  ... }`
                  l map { (b, n) => b + n }
                           ^
    <console>:9: error: missing parameter type
                  l map { (b, n) => b + n }
                              ^
    

    For an apply, you get "auto-tupling":

    scala> def f(p: (Int, Int)) = p._1 + p._2
    f: (p: (Int, Int))Int
    
    scala> f(1,2)
    res0: Int = 3
    

    where you supplied two args instead of one.

    But you don't get auto-untupling.

    People have always wanted it to work that way.