3

私は次の機能を持っています

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

そして、次のように、プレフィックスの値を p1 に固定する別の関数を f1 から定義したいと思います。

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 がデフォルトで提供するメソッドでは。2 つのパラメーターを使用すると、次のように機能します。

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 に答える