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