Carte aplatir et flatmap pas d'équivalent

Je pensais que Scala construction map(f).aplatir est équivalent à flatMap(f). Mais avec cet exemple, il n'est pas le cas. Je me demande quel est le rôle de la classe de cas. Si je utiliser les nombres entiers, les deux sont équivalents. Mais dans mon cas, je ne peux pas.

case class CTest(v: Int)
val s = Set(Map(CTest(0) -> List(0, 3), CTest(1) -> List(0, 2)))
val possibilities = s flatMap { m =>
  val mapping = m flatMap {
    case (label, destNodes) => destNodes map {
      case nodes => (label, nodes) }
  }
  mapping
}
possibilities

Rendements

Set((CTest(0),3), (CTest(1), 2))

alors que

case class CTest(v: Int)
val s = Set(Map(CTest(0) -> List(0, 3), CTest(1) -> List(0, 2)))
val possibilities = s flatMap { m =>
  val mapping = m map {
    case (label, destNodes) => destNodes map {
      case nodes => (label, nodes) }
  }
  mapping.flatten
}
possibilities

rendements

Set((CTest(0),0), (CTest(0),3), (CTest(1),0), (CTest(1),2))

Aucune idée pourquoi?

OriginalL'auteur Mikaël Mayer | 2013-11-26