如何在函数式编程映射方法中模拟“返回”语句(或其他使该代码工作和可读的方法)[关闭]

Posted

技术标签:

【中文标题】如何在函数式编程映射方法中模拟“返回”语句(或其他使该代码工作和可读的方法)[关闭]【英文标题】:How to simulate "return" statement (or other ways to make this code work and readable) in functional programming map method [closed] 【发布时间】:2021-12-16 15:43:59 【问题描述】:

假设我在 Scala(或其他函数式编程语言)中有这段代码:

val nums = Seq(1, 2, 3, 4, 5)
nums.map(n => 
  if (n % 2 == 0) 
    n * 2 // double the number if it's an even number
  

  val a = heavyComputation()
  if (a) 
    log(a)
    n * 3 // triple the number if a is true
  

  n
)

这将始终返回不是我想要的原始列表。我知道这可以解决问题:

nums.map(n => 
  if (n % 2 == 0) 
    n * 2
   else 
    val a = heavyComputation()
    if (a) 
      log(a)
      n * 3
     else 
      n
    
  
)

但我必须在else 中嵌套一些代码。这已经使代码有点混乱。现在,如果我有更多 if 检查,我必须再次嵌套它们,这会使代码不可读。

为什么我不能只在 Scala 中执行 return n * 2(或者我想在任何函数式代码中)?

【问题讨论】:

else 部分定义另一个函数 为什么这个标签是 JS? 您可以将 lambda 中的代码移动到辅助 def,然后您可以使用 return - 但是,我真的不明白使用 if else 有什么麻烦;但这可能属于事物的主观领域。如果您有需要帮助的特定代码,请编辑问题。 return 从封闭的命名方法返回,而不是封闭的 lambda。 【参考方案1】:

这是调整发布代码的一种方法。

nums.map(n => 
  lazy val hc: Boolean = heavyComputation()
 
  if (n % 2 == 0) n * 2           //hc never evaluated  
  else if (hc)   log(hc); n * 3 //hc is evaluated
  else            n
)

【讨论】:

以上是关于如何在函数式编程映射方法中模拟“返回”语句(或其他使该代码工作和可读的方法)[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

函数式编程

函数式编程的特点

第一章 介绍函数式编程

函数式编程

函数与函数式编程

2021年大数据常用语言Scala(二十二):函数式编程 映射 map