Можно ли реализовать эту функциональность с помощью системы типов Haskell?

В Scala операции более высокого порядка над коллекциями всегда возвращают наилучший из возможных типов в контексте. Например, в случае BitSet , если вы сопоставите целые числа с целыми числами, вы получите BitSet , но если вы сопоставите целые числа со строками, вы получите общий Набор . Точно так же, если вы сопоставляете 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. : -)

18
задан missingfaktor 9 October 2011 в 17:12
поделиться