【问题标题】:Scala Generic Function Values (Anonymous Function) - Missing Parameter Type (Error)Scala 通用函数值(匿名函数) - 缺少参数类型(错误)
【发布时间】:2010-03-25 15:52:44
【问题描述】:

我是 Scala 新手(Scala 代码运行器版本 2.7.7.final),我真的不明白为什么在我们使用 high 时它要求调用者提供参数类型排序函数。

在下面的示例中,我有一个具有一个功能的独立对象 (Util)。但是在Main块中,调用者必须将参数类型传递给匿名函数。

为什么 Scala 不从 Array 类型(即 String)推断函数的类型?有什么办法吗?

object Util {

 // Just for fun! Suppose that the arrayOne and arrayTwo are all the same length.
 // will swap the elements from arrayOne to ArrayTwo.
  def swap[T](arrayOne:Array[T], arrayTwo:Array[T] , f:(T,T) =>(T,T)) {
    for(i <- 0 until (arrayOne.length min arrayTwo.length)){
      val (left, right) = f(arrayOne(i),arrayTwo(i))
      arrayOne(i) = left
      arrayTwo(i) = right
    }
  }
}

object Main extends Application {

   val arrayOne = Array("A","B","C")
   val arrayTwo = Array("D","E","F")

 //If not specified the type String,the compiler throws "Missing Parameter Type" error

Util swap(arrayOne, arrayTwo,(elem1:String,elem2:String)=>(elem2,elem1))

}

【问题讨论】:

  • 仅对我有用 Util 对象中缺少一个 }。
  • @Thomas 之所以有效,是因为他在函数中指定了类型。 :-)
  • @Daniel 类型注释是这段代码困扰我的最后一件事。我想知道修复它是否会很粗鲁。将注意力转移到最后一行。
  • @Thomas 你还想解决什么问题吗?做就行了,没问题! :D

标签: function scala generics anonymous-function


【解决方案1】:

它不会推断T 的类型,因为此时它唯一需要经过的就是arrayOnearrayTwo。然而,Scala 并不使用一个参数的类型来推断另一个参数的类型,可能是因为它会导致方法重载的问题。但是,如果你咖喱它,它会起作用:

Object Util {

 // Just for fun! Suppose that the arrayOne and arrayTwo are all the same length.
 // will swap the elements from arrayOne to ArrayTwo.
   def swap[T](arrayOne:Array[T], arrayTwo:Array[T])(f:(T,T) =>(T,T)) : Unit = {
     var i = 0   
        var tuple :Tuple2[T,T] = null
       while(i < arrayOne.length && i < arrayTwo.length){
         tuple =f(arrayOne(i),arrayTwo(i))
         arrayOne(i) = tuple._1
         arrayTwo(i) = tuple._2
         i+=1
        }
      }
}

object Main extends Application {

   // val works fine below -- the object is mutable
   val arrayOne = Array("A","B","C")
   val arrayTwo = Array("D","E","F")

   (Util swap(arrayOne, arrayTwo))((elem1,elem2)=>(elem2,elem1))
   // The weird parenthesis is caused by mixing operator notation and currying
   // One could also write it like this:
   // Util.swap(arrayOne, arrayTwo)((elem1,elem2)=>(elem2,elem1))
}

如果你对它进行 curry 它工作正常的原因是 curried 方法实际上是一个接收第一个参数列表并返回一个需要另一个(或其他)参数列表的函数的方法。因此,重载可以在第一个参数列表中决定,因此第二个参数列表可以利用推断类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-12
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    相关资源
    最近更新 更多