在Scala中,集合上的高阶操作总是返回上下文中最好的类型。例如,在BitSet的情况下,如果将int映射到int,您将获得一个BitSet,但是如果将int映射到字符串,则会得到一个常规Set。同样,如果您将Map映射到产生一对的函数,那么您将得到一个Map。否则你得到一个简单的迭代。 map的结果的静态类型和运行时间表示都取决于传递给它的函数的结果类型。
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,93).map(_ + "hola") res4: scala.collection.immutable.Set[String] = Set(2hola,44hola,93hola)
在Haskell的类型系统中是否可以实现相同的功能?如果是,怎么样?上述代码片段中的例子的Haskell翻译将非常感谢。