Return type mismatch error for a tuple


#1

Hi,
Early days part 2. So I defined a Map for customer details as shown below:
scala> val customers = Map(1 -> (1, “A”, “S”), 2->(2, “P”, “S”))
_ customers: scala.collection.immutable.Map[Int,(Int, String, String)] = Map(1 -> (1,A,S), 2 -> (2,P,S))_

The following function I defined works fine.
scala> def getCust(x: Int, cust: Map[Int, (Int, String, String)]) = {
_ | println(cust.get(x)) }_
_ getCust: (x: Int, cust: Map[Int,(Int, String, String)])Unit_

_ scala> getCust(1, customers)_
_ Some((1,A,S))_

Then I try to redefine it by wanting to return a tuple from the function, I hit compile error which I tried to figure out to no avail. Any help is appreciated.

_scala> def getCust(x: Int, cust: Map[Int, (Int, String, String)]):(Int, String, String) = {_
_     | cust.get(x) }_
_<console>:12: error: type mismatch;_
_ found   : Option[(Int, String, String)]_
_ required: (Int, String, String)_
_       cust.get(x) }_
_               ^_

Thanks,
Anoop


#2

Map[A, B].get(key: A) returns Option[B] (None if key is not present)
Map[A, B].apply(key: A) returns B (exception if key is not present)

.apply can be abbreviated so second syntax is usually replaced by:
Map[A, B](key: A) which returns B


#3

I have seriously no clue what you just said wrt the problem. Again, this is my first week with Scala. So I may not be knowing what you are trying to imply. I do know about apply method but I do not see how it is a problem of mismatch.

Thanks,
Anoop


#4

I’ve mainly rephrased what documentation says. You wanted to return a raw tuple, but Map.get returns value wrapped in Option (to support missing values).

Documentation for Map.get: https://www.scala-lang.org/api/current/scala/collection/immutable/Map.html#get(key:K):Option[V]
Documentation for Map.apply: https://www.scala-lang.org/api/current/scala/collection/immutable/Map.html#apply(key:K):V

If you want to know about .apply method and syntactic sugar for it, check this: https://blog.matthewrathbone.com/2017/03/06/scala-object-apply-functions.html

If you want to return raw value you should use .apply method instead of .get


#5

Thanks. That helped.

Regards,
Anoop


#6

Hi Anoop, btw you will make it easier to read your code samples if you format them properly. For block-level code samples (one or more lines), put three backtick characters before and after each block of code, like this (except use backtick, the key just below the Esc key):

'''
def f(x: Int): Int = x + 1
'''

#7

Thanks Yawaramin. Will surely check it out and use it.

Thanks and Regards,
Anoop
(20 words limit)