Jam*_*ies 5 monads scala typeclass scalaz
我目前正在将一些代码从传统的Scala移植到Scalaz风格.
在我的大多数代码中,在我公开的API签名中使用Seq特征而不是直接使用具体类型(即List,Vector)是相当常见的.但是,这给Scalaz带来了一些问题,因为它没有提供Bind [Seq]类型类的实现.
即这将正常工作.
List(1,2,3,4) >>= bindOperation
Run Code Online (Sandbox Code Playgroud)
但这不会
Seq(1,2,3,4) >>= bindOperation
Run Code Online (Sandbox Code Playgroud)
失败了 could not find implicit value for parameter F0: scalaz.Bind[Seq]
我认为这是Scalaz中的故意设计决定 - 但我不确定如何在之前的预期/最佳实践.
我是否应该将代码直接写入List/Vector而不是使用更灵活的Seq接口?或者我应该简单地定义我自己的Bind [Seq]类型类?
Tra*_*own 11
集合库执行后空翻以适应子类型:当您使用map特定集合类型(列表,映射等)时,您(通常)会返回相同的类型.它通过使用极其复杂的继承层次结构和类型类来管理它CanBuildFrom.它完成了工作(至少可以说是有争议的),但复杂性并不是很有原则性.一团糟.很多人讨厌它.
作为图书馆用户,复杂性通常很容易避免,但对于图书馆设计师来说,这是一场噩梦.如果我提供monad实例Seq,这意味着我的所有用户类型都会将层次结构提升到Seq他们使用monadic操作的每种类型.
Scalaz人们往往不喜欢子类型非常多,无论如何,所以大部分Scalaz停留在hierarchy-叶周围List,Vector等你可以看到这个决定的一些讨论的邮件列表,例如.
当我第一次开始使用Scalaz时,我编写了许多实用程序代码,试图为其提供实例Seq等,并使它们可用CanBuildFrom.然后我停了下来,现在我倾向于遵循Scalaz只使用过List,Vector,Map,和Set在我自己的代码.如果你致力于"Scalaz风格",你应该做的,以及(或者甚至采用Scalaz自己IList,ISet,==>>,等).但是,你不会更普遍地找到关于最佳实践的明确协议,并且这两种方法都可以起作用,所以你只需要尝试找到你喜欢的方法.
| 归档时间: |
|
| 查看次数: |
346 次 |
| 最近记录: |