0

マージされたシーケンスに要素がソートされるように、Scala で 2 つの日付シーケンスをマージしようとしています。次のように 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に比較的慣れていません。問題に見えるのは?

4

1 に答える 1

0

最初は部分実装という用語はありません。少なくとも私はそのようなことを聞​​いたことがありません。部分適用を意味していると思いますが、この場合、部分適用はありません。部分適用はカリー化された関数に関するものであり、コンパイラとは何ですかエラーメッセージであなたに伝えようとしています。この例:

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

これは部分的なアプリケーションです。カリー化された関数を使用すると、別の関数が返され、1 つの引数が渡され (部分的に適用されます)、後者が別の引数を渡します。

あなたのソートの問題に関しては、それはうまくいくはずです。どのライブラリを使用しているかはわかりませんが、日付時刻では似ています。問題は割り当てにあると思います(_.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)
于 2013-10-18T10:16:04.050 に答える