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

Scalaz Bind [Seq]类型类

发布时间:2020-12-16 18:43:01 所属栏目:安全 来源:网络整理
导读:我目前正在将一些代码从传统的 Scala移植到 Scalaz风格. 在我的大多数代码中,在我公开的API签名中使用Seq特征而不是直接使用具体类型(即List,Vector)是相当常见的.但是,这给Scalaz带来了一些问题,因为它没有提供Bind [Seq]类型类的实现. 即这将正常工作. Lis
我目前正在将一些代码从传统的 Scala移植到 Scalaz风格.

在我的大多数代码中,在我公开的API签名中使用Seq特征而不是直接使用具体类型(即List,Vector)是相当常见的.但是,这给Scalaz带来了一些问题,因为它没有提供Bind [Seq]类型类的实现.

即这将正常工作.

List(1,2,3,4) >>= bindOperation

但这不会

Seq(1,4) >>= bindOperation

失败的错误无法找到参数F0的隐含值:scalaz.Bind [Seq]

我认为这是Scalaz中的故意设计决定 – 但我不确定如何在之前的预期/最佳实践.

我是否应该将代码直接写入List / Vector而不是使用更灵活的Seq接口?或者我应该简单地定义我自己的Bind [Seq]类型类?

解决方法

集合库执行后空翻以适应子类型:当您在特定集合类型(列表,映射等)上使用映射时,您(通常)将返回相同的类型.它通过使用 an extremely complex inheritance hierarchy以及CanBuildFrom等类型类来管理这一点.它完成了工作(至少可以说是有争议的),但复杂性并不是很有原则性.一团糟.很多人讨厌它.

作为图书馆用户,复杂性通常很容易避免,但对于图书馆设计师来说,这是一场噩梦.如果我为Seq提供monad实例,这意味着我的所有用户类型都会将层次结构提升到Seq,每种类型都使用monadic操作.

无论如何,Scalaz人不喜欢非常喜欢子类型,因此大多数情况下Scalaz都会停留在层次结构 – List,Vector等的叶子周围.例如,您可以看到对此决定on the mailing list的一些讨论.

当我第一次开始使用Scalaz时,我编写了许多实用程序代码,试图为Seq等提供实例,并使它们可以与CanBuildFrom一起使用.然后我停了下来,现在我倾向于跟随Scalaz只使用我自己的代码中的List,Vector,Map和Set.如果您致力于“Scalaz风格”,您也应该这样做(或者甚至采用Scalaz自己的IList,ISet,==>>等).但是,你不会更普遍地找到关于最佳实践的明确协议,并且这两种方法都可以起作用,所以你只需要尝试找到你喜欢的方法.

(编辑:李大同)

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

    推荐文章
      热点阅读