在Scala中,集合上的高阶操作总是返回上下文中可能的最佳类型。例如,在BitSet
的情况下,如果将in映射到in,则会得到一个BitSet
,但如果将in映射到字符串,则会得到一个通用的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翻译将非常受欢迎。:-)
https://stackoverflow.com/questions/7705119
复制相似问题