【问题标题】:Partially applied isBefore function in Scala gives errorScala中的部分应用isBefore函数给出错误
【发布时间】:2016-01-26 06:52:26
【问题描述】:

我正在尝试在 Scala 中合并两个日期序列,以便合并后的序列具有排序的元素。我正在使用 isBefore 的部分实现,如下所示:

  val seq1 = Seq(LocalDate.of(2014, 4, 5), LocalDate.of(2013, 6 ,7), LocalDate.of(2014, 3, 1))
  val seq2 = Seq(LocalDate.of(2012, 2, 2), LocalDate.of(2015, 2, 1))
  var arr = (seq1 ++ seq2).sortWith(_.isBefore(_) = 1)
  println(arr)

但它显示 isBefore 函数的编译错误:

 Multiple markers at this line
- missing arguments for method isBefore in class LocalDate; follow this method with `_' if you want to 
 treat it as a partially applied function
- missing arguments for method isBefore in class LocalDate; follow this method with `_' if you want to 
 treat it as a partially applied function

我对 Scala 比较陌生。似乎是什么问题?

【问题讨论】:

    标签: scala


    【解决方案1】:

    一开始没有partial implementation这个词,至少我没听说过,我猜你的意思是partial application,但是这里没有partial application,partial application是关于curried函数的,编译器试图在您的错误消息中告诉您什么。示例:

    def test(a: String)(f: String => String) = f(a)
    
    val onString = test("hello world") _
    
    onString(_.capitalize)
    
    test: (a: String)(f: String => String)String
    onString: (String => String) => String = <function1>
    res8: String = Hello world
    

    这是一个部分应用程序,你使用一个柯里化函数,它返回另一个函数并传递一个参数(部分应用它),后者传递另一个参数。

    至于您的排序问题,应该可以。我不知道您使用的是哪个库,但日期时间很相似。我认为问题出在分配(_.isBefore(_) = 1),这是非法的。应该是这样的:

    val seq1 = Seq(LocalDate.parse("2014-04-05"), LocalDate.parse("2013-06-07"), LocalDate.parse("2014-03-01"))
    val seq2 = Seq(LocalDate.parse("2012-02-02"), LocalDate.parse("2015-02-01"))
    var arr = (seq1 ++ seq2).sortWith(_.isBefore(_))
    
    arr: Seq[org.joda.time.LocalDate] = List(2012-02-02, 2013-06-07, 2014-03-01, 2014-04-05, 2015-02-01)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多