Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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 kestrel函数式编程设计模式的附加值是什么?(斯卡拉)_Scala_Design Patterns_Functional Programming - Fatal编程技术网

Scala kestrel函数式编程设计模式的附加值是什么?(斯卡拉)

Scala kestrel函数式编程设计模式的附加值是什么?(斯卡拉),scala,design-patterns,functional-programming,Scala,Design Patterns,Functional Programming,我想知道为什么用红隼来消除代码的副作用是如此有用。有人有这方面的经验吗?并且可以解释真正的动机,以及它到底是如何起作用的 尽管我知道纯函数式编程是零副作用的,而且从此以后代码的调试和可预测性会更好。然而,在红隼的例子中,我不认为这真的有什么帮助 最好的 MM-关键是避免创建一个您可能不希望存在的中间变量,或者避免为您正在进行的操作创建一个新的块。让我们假设红宝石中有红隼: implicit class RubyKestrel[A](val repr: A) extends AnyVal {

我想知道为什么用红隼来消除代码的副作用是如此有用。有人有这方面的经验吗?并且可以解释真正的动机,以及它到底是如何起作用的

尽管我知道纯函数式编程是零副作用的,而且从此以后代码的调试和可预测性会更好。然而,在红隼的例子中,我不认为这真的有什么帮助

最好的


MM-

关键是避免创建一个您可能不希望存在的中间变量,或者避免为您正在进行的操作创建一个新的块。让我们假设红宝石中有红隼:

implicit class RubyKestrel[A](val repr: A) extends AnyVal {
  def tap[B](f: A => B) = { f(repr); repr }
}
现在让我们假设我们有一些代码行:

xs.map(_ + 7).filter(foo).take(n)
我们想在过滤器之后打印一条调试消息。如果没有
点击
,我们将该行重构为:

{
  val temp = xs.map(_ + 7).filter(foo)
  println(temp)
  temp.take(n)
}
啊。现在假设我们有
点击

xs.map(_ + 7).filter(foo).tap(println).take(n)
def newStack = (new Stack).tap(_ add "whatever")
哇,好多了

假设我们有一个堆栈,它有一个add方法,我们想在其他地方使用它之前向堆栈中添加一些东西

def newStack = {
  val stack = new Stack
  stack add "whatever"
  stack
}
啊。但使用
轻触

xs.map(_ + 7).filter(foo).tap(println).take(n)
def newStack = (new Stack).tap(_ add "whatever")

非常方便——它确实可以让您将任何正常的副作用方法转换为可以链接调用的方法。由于链式调用通常是较低的样板文件,这通常是一个巨大的成功。

这也是促使我自然想要一个tap的需要:我想避免创建变量,然后在块的末尾重复它们。使用tap,代码更短,可读性更强(我认为它应该是Scala本身的一部分)。