gpt4 book ai didi

function - Scala通用函数值(匿名函数)-缺少参数类型(错误)

转载 作者:行者123 更新时间:2023-12-04 03:24:24 28 4
gpt4 key购买 nike

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

在下面的示例中,我有一个具有一个功能的独立对象(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))

}

最佳答案

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

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 ,它之所以能正常工作的原因是, curry 方法实际上是一种接收第一个参数列表并返回需要其他(或其他)参数列表的函数的方法。因此,可以在第一个参数列表中确定重载,因此第二个参数列表可以利用推断的类型。

关于function - Scala通用函数值(匿名函数)-缺少参数类型(错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2517070/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com