2013-05-31 2 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]]G[F[A]] (F에 이동이라고 가정하고 Gis an applicative functor)를 반환해야 시퀀싱 이후, 처음에 기대했던 없습니다. 이 경우에도 Option 계층이 사라집니다.

나는 이것이 아마 Set의 슈퍼 타입 중 하나 sequenceU 작업을하게 Unapply 기계 사이에 상호 작용이 함께 할 수있는 뭔가가 알고, 내가 유형을 통해 작업을 쓸 계획입니다 몇 분을 찾을 수있을 때 무슨 일이 일어나고 있는지 설명해.

그것은 잠재적으로 흥미있는 작은 퍼즐처럼 보입니다. 누군가가 저를 답으로 이길 수있는 경우에 대비해 여기에 게시 할 것입니다.

답변

7

와우, 예. 내가 추측 할 수있는 것은 여기에있다. 설정 자체의 실용적이 없기 때문에, 우리는 대신 모노 이드 # 실용적 인스턴스를 얻고있다 :

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

가 가지 유형에 대해 정의 종류 * 및 실용적의 유형에 대해 정의 * -> * 이 유형의 λα 멀리 발생합니다 매개 변수, 그래서 경우가 실용적 # 포인트를 호출 할 때

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의 흥미로운 부작용을 가지고 있다고 지적