Ostatnia noc w reagowaniu na this question, zauważyłem następujące:Set sekwencjonowanie typu puzzle
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)
Oznacza to, że jeśli foo
jest opcjonalny zestaw liczb, sekwencjonowanie zwraca zbiór liczb całkowitych.
To nie jest to, czego oczekiwano na początku, ponieważ sekwencjonowanie F[G[A]]
powinien zwrócić G[F[A]]
(zakładając, że F
jest przesuwny i G
is an applicative functor). W tym przypadku jednak warstwa Option
po prostu znika.
wiem to chyba ma coś wspólnego z jakąś interakcję pomiędzy jednym z supertypes z Set
i maszyn Unapply
sprawia, że sequenceU
pracę, a kiedy znajdę kilka minut mam zamiar pracować przez rodzajów i pisać opis tego, co się dzieje.
Wydaje się jednak, że jest to potencjalnie interesująca łamigłówka i pomyślałem, że opublikuję ją tutaj, na wypadek, gdyby ktoś mógł mnie pokonać.