scala - Kestrel 函数式编程设计模式的附加值(value)是什么? (斯卡拉)

标签 scala design-patterns functional-programming

我想知道为什么使用 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/

相关文章:

performance - 在保持顺序的同时有效地随机抽样列表

java - 如何从 java 调用 Amazon Deequ hasDataType

java - Java中的可观察模式实现

list - 如何在 Erlang 中编写模拟?

multithreading - 纯函数式数据结构总是无锁的吗?

scala - ZIO Fiber orElse 生成异常消息

带有 Runnable 类 : Is Receiver missing? 的 java 命令模式示例

design-patterns - 客户有 8 或 9 个产品,其中 80% 相似。这是哪种设计模式?

ruby - ruby 中的功能代码示例

java - JCEF ICU 检查失败