3

我有以下功能

scala> def f1 = (prefix: String) => prefix + ".field"
f1: String => java.lang.String

我想从 f1 定义另一个函数,将前缀的值固定为 p1,就像这样

def f2: () => String = () => f1("p1")

或更短时间

def f2 = () => f1("p1")

我认为使用 Function.curried 或 f.curried 和部分应用函数可以实现相同的目标,但我仍然无法做到......

--

看看这篇文章,我发现了一种更详细的定义方式。我想上面的语法对于这种较长的形式来说只是糖...

scala> object f2 extends Function0[String] {
     | override def apply = f1("p1")
     | }
defined module f2

scala> f2
res37: f2.type = <function0>

scala> f2()
res38: java.lang.String = p1.field
4

3 回答 3

3

您只能“咖喱”具有多个参数的函数。至少使用 Scala 默认提供的方法。使用两个参数,它的工作原理如下:

val f2 = (prefix: String, foo:String) => prefix + ".field"
val f1 = f2.curried("p1")

如果你想对 做同样的事情Function1,你可以“拉皮条”这个类来添加一个新方法:

implicit def addCurry[A,B](f:Function[A,B]) = new Function1WithCurried(f)
class Function1WithCurried[-A,+B](f:Function1[A,B]) {
  def curried:Function1[A,Function0[B]] = (x:A) => { () => f(x) }
}

def f1 = (prefix: String) => prefix + ".field"
val f0 = f1.curried
val f2 = f1.curried("p1")
于 2012-10-07T19:22:50.117 回答
1

进一步扩展@Kim Stebel 的答案。你可以这样做:

scala> val f2 = (prefix: String, foo:String) => prefix + ".field"
f2: (String, String) => java.lang.String = <function2>

scala> val f1 = f2("p1",_:String)
f1: String => java.lang.String = <function1>

为了清楚起见,我们在这里所做的不是柯里化,而是“部分应用”。

于 2012-10-07T20:00:59.523 回答
0

如果您正在寻找的是柯里化,您可以像这样更详细地执行它:

scala> def f1(f: String => String)(s: String) = f(s)
f1: (f: String => String)(s: String)String

scala> def f2 = () => f1(p => p + ".field")("p1")
f2: () => String

scala> f2()
res4: String = p1.field
于 2012-10-07T23:03:55.143 回答