加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 设置排序类型拼图

发布时间:2020-12-16 08:57:06 所属栏目:安全 来源:网络整理
导读:昨晚在回复 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.sequenceUres0: scala.collection.imm
昨晚在回复 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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读