在Scala中,集合上的高阶操作总是返回上下文中最佳的可能类型。例如,在BitSet
的情况下,如果您将整数映射到整数,则会得到一个BitSet
,但如果您将整数映射到字符串,则会得到一个通用的Set
。同样地,如果您使用生成对的函数map
一个Map
,那么您将得到一个Map
作为返回值。否则,您将得到一个简单的Iterable
。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, 44, 93).map(_ + "hola")
res4: scala.collection.immutable.Set[String] = Set(2hola, 44hola, 93hola)
在Haskell的类型系统中是否有可能实现相同的功能?如果是,如何实现?非常感谢将上述代码片段的示例翻译成Haskell。