Maa*_*mon 9 design-patterns functional-programming scala
我想知道为什么使用Kestrel放弃代码的副作用部分是如此有用.有没有人有这方面的经验?并且可以解释真正的动机以及它如何帮助到底.
虽然我知道Pure函数编程是关于零方效应的,因此可以更好地调试和预测代码.但是对于Kestrel来说,我看不出它真的有帮助吗?
最好,
MM-
Rex*_*err 19
关键是要避免创建一个你可能不想躺在那里的中间变量,或者避免为你正在做的事情创建一个新的块.假设我们在Ruby中使用了Kestrel:
implicit class RubyKestrel[A](val repr: A) extends AnyVal {
def tap[B](f: A => B) = { f(repr); repr }
}
Run Code Online (Sandbox Code Playgroud)
现在让我们假设我们有一些代码:
xs.map(_ + 7).filter(foo).take(n)
Run Code Online (Sandbox Code Playgroud)
我们想在过滤器后打印出调试信息.没有tap
我们重构那条线:
{
val temp = xs.map(_ + 7).filter(foo)
println(temp)
temp.take(n)
}
Run Code Online (Sandbox Code Playgroud)
啊.现在假设我们有tap
:
xs.map(_ + 7).filter(foo).tap(println).take(n)
Run Code Online (Sandbox Code Playgroud)
哇,方式更好!
假设我们有一个具有add方法的堆栈,我们希望在将其用于其他地方之前向堆栈添加内容.
def newStack = {
val stack = new Stack
stack add "whatever"
stack
}
Run Code Online (Sandbox Code Playgroud)
啊.但是tap
:
def newStack = (new Stack).tap(_ add "whatever")
Run Code Online (Sandbox Code Playgroud)
非常方便 - 它实际上只是让你可以将任何正常的副作用方法转换为可以链接调用的东西.由于链式通话往往是较低的样板,这通常是一个巨大的胜利.
归档时间: |
|
查看次数: |
915 次 |
最近记录: |