В Scala операции более высокого порядка в коллекциях всегда возвращают наилучший тип в контексте. Например, в случае BitSet
, если вы сопоставляете int с ints, вы получаете BitSet
, но если вы сопоставляете int с строками, вы получаете общий Set
. Аналогично, если вы map
a map
с функцией, которая дает пару, то вы получите map
взамен. Иначе вы получите простой Iterable
. Как статический тип, так и представление результата выполнения во время выполнения зависят от типа результата передаваемой ему функции.
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)
Возможно ли реализовать ту же функциональность в системе типа Haskell? Если да, то как? Был бы высоко оценен перевод примеров Haskell в приведенный выше фрагмент кода.: -)