5

ScalaにDateTimeクラスとTimeSpanクラスがあります(<演算子と+演算子が正常に機能すると仮定します)。開始/停止時間とステッピングのタイムスパンをとる「範囲」関数を定義しようとしています。C#では、これをyieldで実行しますが、Scalaでも同じことができるはずです...奇妙なエラーが発生する場合を除きます。

'yield t'行に、「Illegalstartofstatement」が表示されます。

  def dateRange(from : DateTime, to : DateTime, step : TimeSpan) =
  {
      // not sure what the list'y way of doing this is
    var t = from

    while(t < to)
    {
      yield t; // error: illegal start of statement
      t = t + step
    }
  }

このコードを見て、私は2つのことに興味があります:1)私は何を間違えましたか?2)記述されたコードは非常に必須です(var tなどを使用します)。適度に高速なScalaでこれを行うためのより機能的な方法は何ですか?

ありがとう!

4

3 に答える 3

17
def dateRange(from : DateTime, to : DateTime, step : TimeSpan): Iterator[DateTime] =
  Iterator.iterate(from)(_ + step).takeWhile(_ <= to)
于 2011-10-28T13:11:41.190 に答える
3

これは、joda期間を持つ@Debilskiソリューションのバージョンです。

import org.joda.time.{DateTime, Period}

def dateRange(from: DateTime, to: DateTime, step: Period): Iterator[DateTime] =
  Iterator.iterate(from)(_.plus(step)).takeWhile(!_.isAfter(to))
于 2013-03-05T13:28:24.103 に答える
0

Scalaでは、yieldforループの特別なステートメントです。

C#はわかりませんが、私が理解していることから、間隔が排他的か包括的かによって、collection.immutable.NumericRange.Exclusive[DateTime]またはを使用するのが最も簡単だと思います。collection.immutable.NumericRange.Inclusive[DateTime]

Integral[DateTime]これを機能させるには、タイプの演算を定義するインスタンスを作成する必要がありますDateTime

于 2011-10-28T13:10:16.543 に答える