缺少具有下划线的扩展函数的参数类型

时间:2017-09-25 21:26:01

标签: scala functional-programming

我正在努力创造自己组成的功能 -

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)

     ^

2 个答案:

答案 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))