我想知道为什么使用 Kestrel 处理代码的副作用部分如此有用。有没有人有经验?并且可以解释真正的动机以及它究竟是如何帮助的。
虽然我知道纯函数式编程是关于零副作用的,因此代码的调试和可预测性更好。但是,就 Kestrel 而言,我不明白这样做有什么帮助?
最好的事物,
毫米-
最佳答案
关键是要避免创建一个您可能不想放置的中间变量,或者避免必须为您正在做的事情创建一个新块。假设我们有 Ruby 中的 Kestrel:
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)
我们想在过滤器之后打印出调试信息。无
tap
我们将该行重构为:{
val temp = xs.map(_ + 7).filter(foo)
println(temp)
temp.take(n)
}
啊。现在假设我们有
tap
:xs.map(_ + 7).filter(foo).tap(println).take(n)
哇,好多了!
假设我们有一个带有 add 方法的堆栈,并且我们想在其他地方使用它之前向堆栈添加一些东西。
def newStack = {
val stack = new Stack
stack add "whatever"
stack
}
啊。但与
tap
:def newStack = (new Stack).tap(_ add "whatever")
非常方便——它真的只是让你把任何普通的副作用方法变成你可以链接调用的东西。而且由于链接调用通常是较低的样板,所以这通常是一个巨大的胜利。
关于scala - Kestrel 函数式编程设计模式的附加值(value)是什么? (斯卡拉),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23231509/