【问题标题】:Scala: How do I write the type of the function that sortBy takes?Scala:如何编写 sortBy 所采用的函数类型?
【发布时间】:2012-02-14 22:24:10
【问题描述】:

我想将 List.sortBy 接受的参数传递给另一个函数。我的代码如下所示:

//Scala
def sortAndMore(list: List[(String, _)], sortFn: Option[???] = None) = {
  val maybeSortedList = sortFn match {
    case None => list
    case Some(fn) => list.sortBy(fn)
  }
  // do some more stuff with this list
}

val myList = ("one", 1)::("three", 3)::("two", 2)::Nil
sortAndMore(myList, Some(_._1 /*???*/)) 

所以最后我希望得到与下面给出的结果相同的结果:

myList.sortBy(_._1)

sortAndMore函数中Option的类型是什么?

Scala API for scala.collection.immutable.List 是这样说的:

def sortBy [B] (f: (A) ⇒ B)(implicit ord: Ordering[B]): List[A] 

我尝试了几件事,但我只是不知道正确的语法,而且猜到它并不幸运。非常感谢任何提示,尤其是指出为什么语法必须如此的指针。

【问题讨论】:

    标签: scala collections types functional-programming


    【解决方案1】:

    这是我的解决方案(在我的终端上编译)

    def sortAndMore(list: List[(String,_)], sortFn: Option[((String,_))=>String] = None) = {
      val maybeSortedList = sortFn match {
        case Some(fn) => list.sortBy(fn)
        case None => list
      }
    }
    
    sortAndMore(myList, Some(_._1))
    

    【讨论】:

    • 我认为 OP 想要一个泛型类型:sortAndMore(list: List[(String, _)],你硬编码了Int
    • 另外,我会去掉 val maybeSortedList = 以便实际返回列表(现在函数返回 Unit)。否则很好的答案,+1
    • @TomaszNurkiewicz 我明白你的意思,因此我将使用这个原型作为函数:def sortAndMore[A](list: List[(String, A)], sortFn: Option[(String, A) => String] = None)。但是,如果它仍然不是它,我不知道
    • @ChrisJamesC 因为你并没有真正使用类型信息你也可以只使用_,所以签名变成def sortAndMore(list: List[(String, _)], sortFn: Option[((String,_))=>String] = None)
    • 感谢你们三个,它与通用类型一起工作!我的错误是我也尝试放入 List,但不知道它只是返回 String 而不是一些 Ordering。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多