2013-05-31 9 views
8

昨夜はthis questionへの対応では、私は次のように気づい:fooが、それは整数の集合を返す配列決定し、整数のオプションで設定されている場合は、ある設定シングタイプのパズル

scala> val foo: Option[Set[Int]] = Some(Set(1, 2, 3)) 
foo: Option[Set[Int]] = Some(Set(1, 2, 3)) 

scala> import scalaz._, Scalaz._ 
import scalaz._ 
import Scalaz._ 

scala> foo.sequenceU 
res0: scala.collection.immutable.Set[Int] = Set(1, 2, 3) 

F[G[A]]の配列を決定する(Fが通行可能であるとGis an applicative functorと仮定して)G[F[A]]を返す必要がありますので、これは、私が最初に期待したものではありません。ただし、この場合はOptionのレイヤーが消えます。

私はこれはおそらくSetのスーパータイプの1とsequenceU作業を行いUnapply機械の間で何らかの相互作用とは何かを持って知っている、と私は種類を介して動作して書くことを計画しています数分を見つけることができるとき何が起こっているのかを説明してください。

それは潜在的に興味深い小さなパズルのように思えますが、誰かが答えに私を打つことができる場合は、私はここに投稿すると思いました。

答えて

7

うわー、そうです。私は何が起こっているか推測できる。設定は、独自のApplicativeのを持っていないので、我々は代わりにモノイド#Applicativeのインスタンスを取得している:

scala> implicitly[Unapply[Applicative, Set[Int]]].TC 
res0: scalaz.Applicative[_1.M] forSome { val _1: scalaz.Unapply[scalaz.Applicative,Set[Int]] } = [email protected] 

をモノイドは*種類のタイプのために定義されており、応用的に*種類のタイプのために定義されているので - > * 、モノイドでのApplicativeの定義は、みかん型ラムダを使用して無視typeパラメータにウェッジ:λの型パラメータαが捨てられているので、Applicativeの番号ポイントが呼び出されたときに、モノイドになることがあり

final def applicative: Applicative[({type λ[α]=F})#λ] = new Applicative[({type λ[α]=F})#λ] with SemigroupApply... 

お知らせ#0、Monoid [Set [Option [Int]]]ではなく、Monoid [Set [Int]]です。

scala> List(1,2,3).sequenceU 
res3: Int = 6 

larshこれは合計として使用した(AB)であることがsequenceUをalllowingの興味深い副作用を有していることを指摘します