Scala curried 函数在条件下执行任何表达式

Posted

技术标签:

【中文标题】Scala curried 函数在条件下执行任何表达式【英文标题】:Scala curried function to execute any expression on condition 【发布时间】:2022-01-24 01:42:24 【问题描述】:

我正在尝试创建一个函数来检查条件是否适用,如果适用则运行任何可能的表达式,以防条件不适用此函数返回默认值, 我可以通过以下方式做到这一点:

def executeOnCondition[T](condition: Boolean, default: T)(f: => T): T = if (condition) f else default

但是我希望这个函数被柯里化,以便它首先采用条件和默认值,然后才执行表达式。 想象的用途:

val useLater = executeOnCondition(true, 3.14)
// do stuff
useLater  3.14 * 2

但是当我尝试以预期的方式创建我的咖喱函数时:

def executeOnCondition[T](condition: Boolean, default: T) = (f: => T) =>  if (condition) f else default 

我得到这个编译错误:

identifier expected but '=>' found.

我猜这个问题与泛型的使用有关, 任何人都可以阐明一些问题并提供解决方法吗?

非常感谢

【问题讨论】:

【参考方案1】:

这是正确的语法:

def executeOnCondition[T](condition: Boolean, default: T): (=> T) => T =
  block => if (condition) block else default

出于某种原因(错误?)你不能输入 => T 作为 lambda 输入的类型,即使该类型是有效的。

【讨论】:

按名称作为类型参数在理论上是被禁止的,但我能够解决它,请在另一个问题 (***.com/questions/52043365/…) 中查看我的答案。 太棒了,谢谢!

以上是关于Scala curried 函数在条件下执行任何表达式的主要内容,如果未能解决你的问题,请参考以下文章

Scala函数柯里化(Currying)

Scala函数柯里化(Currying)

Scala函数柯里化(Currying)

Scala函数柯里化(Currying or Curry)

考虑到在 Scala 中返回函数的其他替代方法,Currying 的目的是啥?

每天学一点Scala之 Currying函数