首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带产量的scala咖喱函数

带产量的scala咖喱函数
EN

Stack Overflow用户
提问于 2014-10-01 19:49:43
回答 2查看 231关注 0票数 1

我试着学习Scala中的咖喱函数,请参阅代码

代码语言:javascript
复制
  def isEven(v: Int): Boolean = v % 2 == 0

  def evens(numbers: List[Int])(even: Int => Unit) {
    for (number <- numbers; if isEven(number)) {
      even(number)
    }
  }

  val my = List.range(1, 100)

  evens(my){println(_)} // works fine and prints the even numbers as expected 

  val recurse = evens(my) { yield _ } //compilation error

我希望得到产量积累的结果,但我不能罚款如何在Scala文档或任何示例中这样做。有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-01 20:07:17

不能抽象出for使用的两种形式。一种是foreach,另一种是map和(可能) flatMap;返回类型也不同。

您可以编写两个函数,也可以编写一个泛型方法并忽略返回值:

代码语言:javascript
复制
def evens[A](numbers: List[Int])(even: Int => A): List[A] = {
  for (number <- numbers if (number % 2) == 0) yield even(number)
}

现在,如果您希望列表保持不变,可以使用identity函数:

代码语言:javascript
复制
val e = evens(my)(identity)
val e = evens(my)(x => x)   // Equivalent

如果要对其进行处理,则忽略返回值:

代码语言:javascript
复制
evens(my)(println)
票数 4
EN

Stack Overflow用户

发布于 2014-10-04 08:25:14

Scala咖喱函数不像我在我的问题中尝试过的那样,可以与收益率一起使用,因此根本没有必要使用咖喱函数,因为您只需这样做:

代码语言:javascript
复制
  def evens(numbers: List[Int]) : List[Int] = {
     for (number <- numbers if (number % 2) == 0) yield number
  }

然后:

代码语言:javascript
复制
    val my = List.range(1, 100)
    evens(my).foreach(f => println(f))

感谢@RexKerr的解决方案,他展示了如何利用泛型和咖喱函数生成并返回咖喱结果。

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

https://stackoverflow.com/questions/26149409

复制
相关文章

相似问题

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