在Scala中,集合的高阶操作总是返回上下文中最好的类型。例如,在BitSet
的情况下,如果您将整数映射为整数,您将得到BitSet
,但是如果将整数映射到字符串,则会得到一个通用的Set
。同样,如果你的map
a Map
具有产生一对的函数,那么你得到Map
作为回报。否则你会得到一个简单的Iterable
。 map的结果的静态类型和运行时表示都依赖于传递给它的函数的结果类型。这个功能可以用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)
是否有可能在Haskell的类型系统中实现相同的功能?如果是,如何?上述代码片段中的示例的Haskell翻译将不胜感激。 :-)