Scalaz Bind [Seq]类型类
我目前正在将一些代码从传统的
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,==>>等).但是,你不会更普遍地找到关于最佳实践的明确协议,并且这两种方法都可以起作用,所以你只需要尝试找到你喜欢的方法. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 单元测试 – 私有方法使用Jasmine进行单元测试
- scala – 播放模板仅在使用括号调用时才有效
- 关于Debug和Release之本质区别的讨论
- angular – tslint error阴影名称:’Observable’
- Angular2 Meteor,实现无限滚动的问题(滚动重置到顶部)
- XFire+WebService+Spring简单Demo
- WebService学习之旅(二)JAX-WS基于Web容器发布WebService
- 将时刻导入Angular会产生错误
- AngularJS表单验证:通过ui.router状态更改$dirty值更改
- twitter-bootstrap – Twitter引导程序表扩展到右侧的容器外