Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function Scala保存排序函数参数_Function_Scala_Sorting - Fatal编程技术网

Function Scala保存排序函数参数

Function Scala保存排序函数参数,function,scala,sorting,Function,Scala,Sorting,我试图保存用于在Scala中对序列进行排序的参数,以便稍后延迟执行 例如,我希望保存(“.value”)排序函数,而不是“list.sortBy(.value)”,并在以后检索此排序函数(“.value”)以进行实际排序 如何保存和检索延迟执行的排序函数参数?以下是一些示例测试代码: class SortTest { def testSort () = { val myClass = new MyClass(0) val list = List (myClass, new

我试图保存用于在Scala中对序列进行排序的参数,以便稍后延迟执行

例如,我希望保存(“.value”)排序函数,而不是“list.sortBy(.value)”,并在以后检索此排序函数(“.value”)以进行实际排序

如何保存和检索延迟执行的排序函数参数?以下是一些示例测试代码:

class SortTest {

  def testSort () = {

    val myClass = new MyClass(0)
    val list = List (myClass, new MyClass(1), new MyClass(2), new MyClass(3), new MyClass(4))

    // Want to sort by value attribute, but don't want to sort right away.  Rather
    // how do I save the sort function, and retrieve it at a later time for execution?
    list.sortBy(_.value)

    // save the sort function (i.e. sort by the value attribute of myClass)
    // something similar to the following syntax
    myClass.setSortFunction (_.value)

    // retrieve the sort function and sort the list
    list.sortBy(myClass.getSortFunction())          

  }

  class MyClass (d:Int){
    val value = d
    val sortFunc = null

    // what should be the signature of this function ?
    def setSortFunction (sortFunc: ()) = {
      this.sortFunc = sortFunc
    }

    // what should be the return type of this function?
    def getSortFunction () = {
      return sortFunc
    }

  }

}

你可以这样做:

val sortFunction = (x : { def value: Int } ) => x.value
list.sorted(myClass.getSortFunction)
此时,您可能对
Int
的硬编码不满意。不幸的是,函数必须具有定义良好的类型,因此我不能对返回类型进行泛型

可以将其定义为:

def sortFunction[T] = (x : { def value: T } ) => x.value
但是,不能传递定义,只能传递值,不能参数化值

另一方面,您的做法是错误的-
sortBy
假设函数是一个参数,并且仅此而已。不正确:
sortBy
接受两个参数:函数和
排序。如果不保存排序,则无法对其进行排序

现在我们来讨论另一个问题。。。函数必须具有类型
MyClass=>T
,并且排序必须是类型
ordering[T]
。如果事先不知道
T
是什么,就无法保存它

幸运的是,
Ordering
是个好主意,您只需创建一个
Ordering[MyClass]
,然后使用它

以下是方法:

class MyClass(d: Int) {
  val value = d
  private var sortFunction: Ordering[MyClass] = _
  def setSortFunction[T : Ordering](f: MyClass => T) {
    sortFunction = Ordering by f
  }
  def getSortFunction = sortFunction
}
你是这样使用它的:

val sortFunction = (x : { def value: Int } ) => x.value
list.sorted(myClass.getSortFunction)

请注意,它使用的不是
sortBy
,而是
sorted
sortBy
方法是通过创建一个
Ordering
并使用它调用
sorted
来实现的,因此不会损失任何性能。

为什么不将此函数分配给变量呢?为什么不使用惰性集合?你想通过推迟排序来完成什么?