In Scala, le operazioni di ordine superiore su collezioni restituiscono sempre il miglior tipo possibile nel contesto. Ad esempio, nel caso di BitSet
, se si esegue il mapping int a int si ottiene un BitSet
, ma se si esegue il mapping interi in stringhe, si ottiene un generale Set
. Allo stesso modo, se un map
Map
con una funzione che produce una coppia, allora si ottiene un Map
in cambio. Altrimenti ottieni un semplice Iterable
. Sia il tipo statico che la rappresentazione runtime del risultato della mappa dipendono dal tipo di risultato della funzione che gli viene passato.Questa funzionalità può essere implementata con il sistema di tipi Haskell?
scala> Map(2 -> 'a', 6 -> 'b') map { case (k, v) => (k + 1, v.toString) }
res0: scala.collection.immutable.Map[Int,java.lang.String] = Map(3 -> a, 7 -> b)
scala> Map(2 -> 'a', 6 -> 'b') map { _._1 }
res1: scala.collection.immutable.Iterable[Int] = List(2, 6)
scala> import collection.immutable.BitSet
import collection.immutable.BitSet
scala> BitSet(2, 44, 93).map(1 +)
res3: scala.collection.immutable.BitSet = BitSet(3, 45, 94)
scala> BitSet(2, 44, 93).map(_ + "hola")
res4: scala.collection.immutable.Set[String] = Set(2hola, 44hola, 93hola)
E 'possibile implementare la stessa funzionalità nel sistema di tipo di Haskell? Se sì, come? Una traduzione Haskell degli esempi nello snippet di codice sopra sarebbe molto apprezzata. :-)