gpt4 book ai didi

scala - 什么是scala过滤方法?

转载 作者:行者123 更新时间:2023-12-02 03:12:04 25 4
gpt4 key购买 nike

这个scalaz tutorial提供了使用filterM方法的例子,但是没有解释。

List(1, 2, 3) filterM { x => List(true, false) }
res19: List[List[Int]] = List(List(1, 2, 3), List(1, 2), List(1, 3), List(1), List(2, 3), List(2), List(3), List())

我看到我可以向它传递一个任意大小的 bool 列表。这个 filterM 方法是什么?

另外,有没有解释更多的 scalaz 的书/教程?

最佳答案

根据实现,需要传递函数A => F[Boolean],比如F: ApplicativefilterM 遍历列表,过滤元素,为其传递谓词(返回 F[true] ),最后将此 List 放入 F

一个更简单的例子:

List(1, 2, 3).filterM[Option](_.some.map(_ % 2 == 0)) // Some(List(2))

请注意,这为您提供了额外的自由度,不仅可以考虑 truefalse,还可以考虑 None。你可以尝试不同的 Applicatives 来掌握这个概念。

在您输入的示例中,List 也是 Applicative。那么,会发生什么(因为它是递归的,所以从最后开始更容易):
1)当你在列表的末尾时 - 你只会得到一个空列表
2) 你有一个列表 3::Nil。将谓词应用于 3 会得到 List(true, false)。因此,您将使用整个 List(3) 和尾部 List()
3) 接下来是 22 -> true::false 映射到 head::head::tailList(2)::List (2, 3)。将它附加到您之前的内容上,您将得到 List(List(2, 3), List(2), List(3), List())
4)现在是最后一步,你得到一个。与您将 1 添加到 true 的每个列表并为 false 取其余部分的方式相同。

List(List(1, 2, 3), List(1, 2), List(1, 3), List(1), List(2, 3), List(2), List(3), List())

我添加了一些日志记录,以明确发生了什么:

current list: List(1, 2, 3)
current list: List(2, 3)
current list: List(3)
current list: List()
filtered value: List(List())
taking head and tail : List(3)
taking tail: List()
filtered value: List(List(3), List())
taking head and tail : List(2, 3)
taking head and tail : List(2)
taking tail: List(3)
taking tail: List()
filtered value: List(List(2, 3), List(2), List(3), List())
taking head and tail : List(1, 2, 3)
taking head and tail : List(1, 2)
taking head and tail : List(1, 3)
taking head and tail : List(1)
taking tail: List(2, 3)
taking tail: List(2)
taking tail: List(3)
taking tail: List()
List(List(1, 2, 3), List(1, 2), List(1, 3), List(1), List(2, 3), List(2), List(3), List())

关于scala - 什么是scala过滤方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39456638/

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