我想编写一个函数,可以得到无限的参数与此语法
MYFUNC ARG1参数3 ....我已经尝试了一些使用curring但没有任何帮助我试图让它recursivly但随后Scala编译器说:“斯卡拉递归方法需要结果类型”递归:
def func(x:Int) = {
doSomething(x); myVal:Int=>func(myVal)
}
感谢助手
我想编写一个函数,可以得到无限的参数与此语法
MYFUNC ARG1参数3 ....我已经尝试了一些使用curring但没有任何帮助我试图让它recursivly但随后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])
正如你所看到的,它模仿了上述定义相当不错(另一种选择将是类型别名,但斯卡拉不支持递归类型的别名)。
我们还定义构造函数方法,以帮助确定使用我们的无限咖喱功能:
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)
也许在这种情况下,你想用的方法有不同的参数个数 - 看对方的回答 - 但是这是你的要求。