gpt4 book ai didi

Scalaz Bind[Seq] 类型类

转载 作者:行者123 更新时间:2023-12-04 17:09:39 24 4
gpt4 key购买 nike

我目前正在将一些代码从传统的 Scala 移植到 Scalaz 风格。

在我的大部分代码中,在我公开的 API 签名中使用 Seq 特征而不是直接使用具体类型(即 List、Vector)是相当普遍的。然而,这给 Scalaz 带来了一些问题,因为它不提供 Bind[Seq] 类型类的实现。

即这将正常工作。

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

但这不会
Seq(1,2,3,4) >>= bindOperation

失败并出现错误 could not find implicit value for parameter F0: scalaz.Bind[Seq]
我认为这是 Scalaz 中的一个有意设计决定 - 但是不确定如何先行的预期/最佳实践。

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

最佳答案

集合库执行后空翻以适应子类型化:当您使用 map 时在特定的集合类型(列表、 map 等)上,您(通常)会得到相同的类型。它通过使用 an extremely complex inheritance hierarchy 来管理它。与类型类如 CanBuildFrom .它完成了工作(至少可以说是),但复杂性感觉不是很有原则。一团糟。很多人讨厌它。

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

无论如何,Scalaz 的人往往不太喜欢子类型化,所以在大多数情况下,Scalaz 停留在层次结构的叶子周围——List , Vector等。你可以看到一些关于这个决定的讨论 on the mailing list , 例如。

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

关于Scalaz Bind[Seq] 类型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24753526/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com