首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >scalaz可折叠组合

scalaz可折叠组合
EN

Stack Overflow用户
提问于 2016-05-28 23:50:51
回答 1查看 162关注 0票数 1

我有下一个代码

代码语言:javascript
复制
val listOption: List[Option[Int]] = List(1.some, none, 2.some)

我想折叠元素,我会写下一段代码

代码语言:javascript
复制
val result = listx.fold(0.some)((acc, el) => {
  (acc, el) match {
    case (Some(a), Some(b)) => Some(a + b)
    case (Some(a), _) => Some(a)
    case (_, Some(b)) => Some(b)
    case _ => el
  }
})
println(result.getOrElse(0)) // => 3 

这很好用,但我在scalaz源代码中看到了下一个tric

代码语言:javascript
复制
val composeFold = Foldable[List] compose Foldable[Option]
composeFold.fold(listOption) // => 3

但是我不明白它是如何正确工作,为什么scalaz不将这些方法混合到listOption实例中,以及scala fold和scalaz fold之间有什么区别

EN

回答 1

Stack Overflow用户

发布于 2016-05-29 00:38:57

scalaz fold函数使用元素的Monoid实例,因此您不必提供起始值和函数来组合这些元素。

Monoid有两个函数zero/emptyappend/combine。对于Int,这可能是:

代码语言:javascript
复制
val intMonoid = new Monoid[Int] {
  def zero = 0
  def append(a: Int, b: => Int) = a + b
}

使用此Monoid[Int],我们可以将Scalaz fold编写为Scala fold

代码语言:javascript
复制
import scalaz.Foldable
import scalaz.std.list._
import scalaz.std.anyVal._

val numbers = List(1,2,3)
Foldable[List].fold(numbers)                          // 6
// analogous to the following Scala fold
numbers.fold(intMonoid.zero)(intMonoid.append(_,_))   // 6

我们可以像您展示的那样将Foldable[List]Foldable[Option]结合起来:

代码语言:javascript
复制
import scalaz.std.option._
Foldable[List].fold(List(1,2))    // 3

Foldable[Option].fold(1.some)     // 1
Foldable[Option].fold(none[Int])  // 0

val foldListO = Foldable[List] compose Foldable[Option]
foldListO.fold(List(1.some, none, 2.some))  // 3

可以使用foldable语法导入并使用concatenatesuml/sumr (也有fold,但它与List.foldOption.fold冲突):

代码语言:javascript
复制
import scalaz.syntax.foldable._
List(1,2,3).concatenate  // 6
1.some.concatenate       // 1

List(1.some, none, 2.some).concatenate.concatenate  // 3

除了像`scalaz.std.list._ _and_ _scalaz.syntax.foldable.`__,这样的特定导入,您还可以使用带有`import scalaz.,Scalaz.`__的超级导入。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37501034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档