scala:使用curry修复参数的值

scala:使用curry修复参数的值,scala,functional-programming,Scala,Functional Programming,我有以下功能 scala> def f1 = (prefix: String) => prefix + ".field" f1: String => java.lang.String 我想从f1中定义另一个函数,它将prefix的值固定为p1,如下所示 def f2: () => String = () => f1("p1") 或者更短期 def f2 = () => f1("p1") 我认为使用Function.curried或f.curried以及部

我有以下功能

scala> def f1 = (prefix: String) => prefix + ".field"
f1: String => java.lang.String
我想从f1中定义另一个函数,它将prefix的值固定为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
scala>对象f2扩展函数0[字符串]{
|覆盖def apply=f1(“p1”)
| }
已定义模块f2
scala>f2
res37:f2.type=
scala>f2()
res38:java.lang.String=p1.field
您只能使用带有多个参数的“curry”函数。至少使用Scala默认提供的方法。有两个参数,其工作原理如下:

val f2 = (prefix: String, foo:String) => prefix + ".field"
val f1 = f2.curried("p1")
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
如果要对
函数1
执行相同操作,可以“拉皮条”该类以添加新方法:

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")

进一步扩展@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>
scala>valf2=(前缀:String,foo:String)=>prefix+“.field”
f2:(字符串,字符串)=>java.lang.String=
scala>val f1=f2(“p1”,_U2;:字符串)
f1:String=>java.lang.String=

为了说明这一点,我们在这里所做的不是咖喱,而是“部分应用”。

如果您想要的是咖喱,您可以像这样做得更详细:

val f2 = (prefix: String, foo:String) => prefix + ".field"
val f1 = f2.curried("p1")
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

是的,我怀疑这一点,所以实现它的唯一方法是手动定义一个新函数,就像我对F2所做的那样。非常感谢您扩展了您的答案。我不明白你把前缀值固定在哪里,看起来你的f0和我的不一样f2@opensas:f0只是一个使用前缀并重新运行函数0的函数。f2是前缀为“fixed”的函数。只是在答案中加了这个。好吧,这正是我想要的(正确答案)。我想知道scala中没有包含这一点,它对我来说似乎很有用。您知道使用
def
s实际上是在定义方法,对吗?这些方法只会返回函数。