Constructor cannot be instantiated to expected type; p @ Person

scala, scala-2.9

Solution

The error information is clear

for( person <- List(alice, bob, charlie) ) {
  person match {
    case p @ Person(_, _, Manager) => println("%s is overpaid".format(p.toString))
    case p @ Person(_, _, _) => println("%s is underpaid".format(p.toString))
  }
}

Here is a short way to do the same thing:

for(p @ Person(_, _, role) <- List(alice, bob, charlie) ) {
  if(role == Manager) println("%s is overpaid".format(p.toString))
  else println("%s is underpaid".format(p.toString))
}

EDIT I am not sure what the real mean of `id` you wanted, I suppose it is the `index` of the person in the list. Here we go:

scala> for((p@Person(_,_,role), id) <- List(alice, bob, charlie).zipWithIndex ) {
     |   if(role == Manager) printf("%dth person is overpaid\n", id)
     |   else printf("Something else\n")
     | }
Something else
1th person is overpaid
Something else

Problem

I am using scala version : `Scala code runner version 2.9.2-unknown-unknown -- Copyright 2002-2011, LAMP/EPFL` I was trying the deep case matching construct from here: http://ofps.oreilly.com/titles/9780596155957/RoundingOutTheEssentials.html and the code is as follows `match-deep.scala`: ``` class Role case object Manager extends Role case object Developer extends Role case class Person(name:String, age: Int, role: Role) val alice = new Person("Alice", 25, Developer) val bob = new Person("Bob", 32, Manager) val charlie = new Person("Charlie", 32, Developer) for( person <- List(alice, bob, charlie) ) { person match { case (id, p @ Person(_, _, Manager)) => println("%s is overpaid".format(p)) case (id, p @ Person(_, _, _)) => println("%s is underpaid".format(p)) } } ``` I am getting following errors: ``` match-deep.scala:13: error: constructor cannot be instantiated to expected type; found : (T1, T2) required: this.Person case (id, p @ Person(_, _, Manager)) => println("%s is overpaid".format(p)) ^ match-deep.scala:13: error: not found: value p case (id, p @ Person(_, _, Manager)) => println("%s is overpaid".format(p)) ^ match-deep.scala:14: error: constructor cannot be instantiated to expected type; found : (T1, T2) required: this.Person case (id, p @ Person(_, _, _)) => println("%s is underpaid".format(p)) ^ match-deep.scala:14: error: not found: value p case (id, p @ Person(_, _, _)) => println("%s is underpaid".format(p)) ``` What am I doing wrong here?

Original source