scala – 设置排序类型拼图
昨晚在回复
this question时,我注意到以下情况:
scala> val foo: Option[Set[Int]] = Some(Set(1,2,3)) foo: Option[Set[Int]] = Some(Set(1,3)) scala> import scalaz._,Scalaz._ import scalaz._ import Scalaz._ scala> foo.sequenceU res0: scala.collection.immutable.Set[Int] = Set(1,3) 也就是说,如果foo是一组可选的整数,那么对它进行排序会返回一组整数. 这不是我最初的预期,因为对F [G [A]]进行排序应该返回G [F [A]](假设F是可遍历的并且是G is an applicative functor).但是,在这种情况下,Option层就会消失. 我知道这可能与Set的一个超类型和使用sequenceU工作的Unapply机器之间的某些交互有关,当我能找到几分钟时,我正计划完成这些类型并编写描述这是怎么回事. 这似乎是一个潜在有趣的小谜题,我想我会在这里发布,万一有人可以打败我的答案. 解决方法
哇,是的这是我可以推测的事情.因为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是针对种类*定义的,因此针对种类* – >定义了应用. *,Monoid sorta中Applicative的定义使用lambda类型在一个被忽略的类型参数中楔入: final def applicative: Applicative[({type λ[α]=F})#λ] = new Applicative[({type λ[α]=F})#λ] with SemigroupApply... 请注意,λ的类型参数α被丢弃,因此当调用Applicative#point时,它变为Monoid#zero,而不是Monoid [Set [Option [Int]]],它是一个Monoid [Set [Int] ]. larsh指出,这具有令人感兴趣的序列U的有趣副作用(ab)用作总和: scala> List(1,3).sequenceU res3: Int = 6 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |