我想用这种语法编写一个可以获取无限参数的函数
myfunc arg1 arg2 arg3 ....我尝试了一些使用curring但没有任何帮助我试图使其递归但随后scala编译器说:“scala递归方法需要结果类型”递归:
def func(x:Int) = {
doSomething(x); myVal:Int=>func(myVal)
}
感谢帮助
我想用这种语法编写一个可以获取无限参数的函数
myfunc arg1 arg2 arg3 ....我尝试了一些使用curring但没有任何帮助我试图使其递归但随后scala编译器说:“scala递归方法需要结果类型”递归:
def func(x:Int) = {
doSomething(x); myVal:Int=>func(myVal)
}
感谢帮助
简单的:
scala> class FRP1 { def apply(args: Int*) = args.mkString("{", ", ", "}") }
defined class FRP1
scala> val frp11 = new FRP1
frp11: FRP1 = FRP1@147611bd
scala> frp11(1)
res0: String = {1}
scala> frp11(1, 2)
res1: String = {1, 2}
scala> frp11(1, 2, 3)
res2: String = {1, 2, 3}
因此,您寻找的函数接受某种类型的参数,并且必须返回一个接受相同类型参数的函数,并返回一个接受相同类型参数的函数,以此类推,无穷无尽。
这里的问题是这个函数的类型是这样的:
T[X] = X => T[X]
也就是说,它是一种递归的、自引用的类型。因为它是自引用的,所以我们必须将其命名为在其内部重用它的唯一目的(不幸的是,Scala 没有用于无限类型的定点组合器)。让我们称之为它InfCurry
,它看起来像这样:
trait InfCurry[T] extends (T => InfCurry[T])
如您所见,它很好地模仿了上述定义(另一种选择是类型别名,但 Scala 不支持递归类型别名)。
让我们也定义一个构造方法来帮助定义我们的无限柯里化函数:
object InfCurry {
def apply[T](f: T => InfCurry[T]): InfCurry[T] = new InfCurry[T] {
def apply(x: T) = f(x)
}
}
使用这个小工具,您可以定义如下内容:
val f: InfCurry[Int] = InfCurry { x =>
println(x)
f
}
你会像这样使用这个小东西:
val g = f(1)(2)(3)(4)(5)(6)(7)
g(8)(9)(10)(11)(12)
在这种情况下,您可能希望使用具有可变数量参数的方法 - 请参阅其他答案 - 但这就是您所要求的。