我正在努力创造自己组成的功能 -
def genericComposition[T](f: T => T, g: T => T) = {
def call(x: T) = g(f(x))
call _
}
def testComposition[T](g: T=>T, n: Int) = {
val call = genericComposition[T](g,g)
def helper(res: T, m: Int) : T = {
if(m == 0) res
else helper(call(res), dec(m))
}
helper(_,n)
}
这应该用f(f(f(x))n次调用f的组合,非泛型版本,其中所有T都是Int或Double等工作正常,但是当我尝试制作通用版本时我使用下划线来将x作为参数传递给辅助函数,但有错误:
错误:(26,11)缺少扩展函数的参数类型((x $ 1: )=> helper(x $ 1,n))helper(_,n)
^
答案 0 :(得分:2)
根据我的经验,id M1 M2 M3 M4 M5 M6
----------- ----- ----- ----- ----- ----- -----
1 May June July Nov Dec Jan
2 Feb Mar Apr Aug Sep Oct
3 Aug Sep Oct NULL NULL NULL
4 May June July NULL NULL NULL
5 Nov Dec Jan NULL NULL NULL
6 Jan Feb Mar July Aug Sep
句法糖有点挑剔。 Scala的类型推断并不完美。它适用于简单的情况,但在某些更微妙的情况下,有时您必须自己提供类型信息。也许其他人可以解释为什么会出现这种情况。
如果指定函数的返回类型,则可以解决问题。无论如何,这通常被认为是好的风格:
_
答案 1 :(得分:0)
请检查这是否是您需要的
def testComposition[T](g: T=>T, n: Int) = {
val call = genericComposition[T](g,g)
def helper( m: Int,res: T) : T = { //changed order of parameters
if(m == 0) res
else helper(dec(m),call(res))
}
(helper _).curried(n) // now we can make it carried
}
println(testComposition[Int](x=>x+1,5)(5))