Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala还有其他方法来编写这个foreach方法吗?_Scala_Recursion_Foreach_Functional Programming - Fatal编程技术网

Scala还有其他方法来编写这个foreach方法吗?

Scala还有其他方法来编写这个foreach方法吗?,scala,recursion,foreach,functional-programming,Scala,Recursion,Foreach,Functional Programming,我使用foreach方法创建了这个case类: case class Sequence[A](initialElems: A*) { private val elems = ArrayBuffer[A]() elems ++= initialElems @tailrec final def foreach(block: A => Unit, elems: ArrayBuffer[A] = elems): Unit = elems.size match { cas

我使用foreach方法创建了这个case类:

case class Sequence[A](initialElems: A*) {
  private val elems = ArrayBuffer[A]()

  elems ++= initialElems

  @tailrec
  final def foreach(block: A => Unit, elems: ArrayBuffer[A] = elems): Unit = elems.size match {
    case 0 =>
    case _  =>
      block(elems.head)
      foreach(block, elems.tail)
  }
}

但是我觉得很奇怪,有没有其他更简单、更有效的方法来编写它?

当您可以使用现有的
foreach
方法时,不清楚为什么您需要递归函数:

case class Sequence[A](initialElems: A*) {
  private val elems = ArrayBuffer[A](initialElems:_*)

  final def foreach(block: A => Unit, elems: ArrayBuffer[A] = elems): Unit =
    elems.foreach(block)
}
能够传入
元素
值也很奇怪。如果您确实传入了一个值,那么这个方法不使用任何类数据,这意味着它实际上不需要是一个方法

最后,通常将
作为最终参数组,以便以更自然的方式使用,如下所示:

case class Sequence[A](initialElems: A*) {
  private val elems = ArrayBuffer[A](initialElems:_*)

  final def foreach(elems: ArrayBuffer[A])(block: A => Unit): Unit = elems.foreach(block)
  final def foreach(block: A => Unit): Unit = elems.foreach(block)
}

val s = Sequence(1,2,3)

s.foreach{ e =>
  println(e)
}

你能详细解释一下你觉得什么“奇怪”吗?@yuval Itzhakov将案例0=>保留为空。也许它是正确的,但我认为它必须是另一种写递归结尾的方法,你不必让case块为空。您可以输入
()
(空括号),这是
Unit
类型的值(唯一的值)。您可以提供一个如何使用此类的示例吗?这可能有助于我们理解您试图实现的目标。但现有的foreach方法不是一个纯函数,不是吗?我正试图构建一个纯函数,为了使它具有尾部递归性,我传递了elems参数。我还需要将该方法包装在case类中,以便于理解。您的
foreach
方法与stdlib
foreach
一样不纯
A=>Unit
是一个副作用函数,因此无法实现一个纯粹使用它的方法。