2013-05-31 40 views
8

Son gece this question yanıt verirken, şu fark ettim: foo o tamsayılar kümesi döndüren dizilimi, tamsayılar, isteğe bağlı bir dizi ise, olduğuSeti sıralama tipi bulmaca

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) 

.

Bu ben F[G[A]] bir G[F[A]] (F çaprazlanabiliyorsa varsayarak ve Gis an applicative functor) dönmelidir dizilmesi beri, ilk başta beklediğim değil. Ancak bu durumda, Option katmanı kaybolur.

bunun muhtemelen Set supertypes biri ve sequenceU çalışmasını sağlayan Unapply makine arasındaki bazı etkileşimlere ile ilgili bir şey olduğunu biliyorum ve ben türleri üzerinden çalışmak ve yazma planlıyorum birkaç dakika bulabilirsiniz zaman neler olduğuna dair bir açıklama.

Belki de ilginç bir küçük bulmaca gibi görünüyor, ve birisinin beni bir cevapla dövmesi ihtimaline karşı burada yayınlayacağımı düşündüm.

cevap

7

vay, evet. İşte anlayabildiğim şey oluyor. Set kendi bir uygulamalı olmadığı için, bunun yerine Monoid # uygulamalı örneğini alıyorsanız:

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

türden tipleri için tanımlanan türden * ve uygulamalı türleri için tanımlanan * -> * orada tip λ arasında α atılır parametresi, yani zaman uygulamalı # noktası denir

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

Bildirim, Monoid olur: Monoid içinde uygulamalı tanımı sorta bir tür lambda kullanarak yok tipi parametresi takozlar #zero, bunun bir Monoid [Set [Opsiyon [Int]]] olması yerine Monoid [Set [Int]] 'dır.

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

Larsh Bu toplamı olarak kullanılan (ab) için sequenceU alllowing ilginç bir yan etkiye sahip olduğunu işaret etmektedir