Scalaでは、コレクションの上位演算は常にコンテキスト内で可能な限り最良の型を返します。たとえば、BitSet
の場合、intをintにマップするとBitSet
が得られますが、intを文字列にマップすると、一般的なSet
が得られます。同様に、map
Map
のペアを生成する関数では、Map
が返されます。それ以外の場合は、簡単なIterable
を取得します。静的型とマップの結果のランタイム表現はどちらも、渡された関数の結果の型に依存します。この機能を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で翻訳していただければ幸いです。 :-)