8

昨夜、この質問に答えて、次のことに気付きました。

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)

つまり、fooが整数のオプションのセットである場合、それを順序付けすると整数のセットが返されます。

シーケンス aは aF[G[A]]を返すはずなので、これは最初は期待していませんでした(それがトラバース可能で、アプリケーション ファンクターであるG[F[A]]と仮定します)。ただし、この場合、レイヤーは消えるだけです。FG Option

これはおそらく、 のスーパータイプの 1 つと機能する機械Setとの間の何らかの相互作用と関係があることを知っています。数分の時間を見つけることができたら、タイプを調べて、何が起こっているかの説明を書き上げる予定です。 .UnapplysequenceU

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

4

1 に答える 1

7

うわー、ええ。これが私が推測できることです。Set には独自の Applicative がないため、代わりに Monoid#applicative インスタンスを取得しています。

scala> implicitly[Unapply[Applicative, Set[Int]]].TC
res0: scalaz.Applicative[_1.M] forSome { val _1: scalaz.Unapply[scalaz.Applicative,Set[Int]] } = scalaz.Monoid$$anon$1@7f5d0856

Monoid は kind * の型に対して定義されており、applicative は kind * -> * の型に対して定義されているため、Monoid での Applicative の定義は、型ラムダを使用して、無視された型パラメーターに含まれます。

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

の型パラメーターが破棄されていることに注意してくださいαλそのため、Applicative#point が呼び出されると、Monoid#zero になり、Monoid[Set[Option[Int]]] ではなく、Monoid[Set[Int]] になります。 .

larsh は、こ​​れには、sequenceU を合計として (ab) 使用できるという興味深い副作用があると指摘しています。

scala> List(1,2,3).sequenceU
res3: Int = 6
于 2013-05-31T13:56:02.820 に答える