在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翻譯將不勝感激。 :-)