2

2時間から5分を引く方法を考えようとしています。

2から5を引くのは意味がありません。これは、一般的な時間単位が-3になり、役に立たないためです。ただし、「時間」が「分」のサブタイプである場合、2時間を120分に変換すると、115分、つまり1時間55分になります。

同様に、5個のリンゴを5個のオレンジに追加したい場合、これをリンゴの観点から評価することはできませんが、最終的に10個の果物になると予想される可能性があります。

上記の例のように、一般に形容詞として数値を使用する場合、整数は、それらが記述するオブジェクトのタイプによってパラメーター化する必要があります。宣言する代わりに、とても便利だと思います

val hours = 2
val minutes = 5

あなたは次のようなことをすることができます

val hours = 2[Hour]
val minutes = 5[Minute]
val result = hours - minutes
assert (result == 115[Minute])

このようなものは存在しますか、それは有用でしょうか、そしてそれは実装できるものですか?

編集:明確にするために、上記の時間の例は私が考えたランダムな例にすぎません。私の質問は、リストなどをパラメータ化したのと同じように、一般にパラメータ化された数値の概念が有用な概念であるかどうかです(答えは「いいえ」かもしれません、わかりません!)

4

4 に答える 4

6

これは、時間と分の2つのクラスと、時間から分への暗黙の変換関数を使用することで実現できます。

trait TimeUnit
case class Hour(val num: Int) extends TimeUnit      
case class Minute(val num: Int) extends TimeUnit {
  def - (sub: Minute) = Minute(num - sub.num)
}

implicit def hour2Minute(hour: Hour) = Minute(hour.num * 60)

これにより、次のようなことができます

val h = Hour(2) - Minute(30) //returns Minute(90)
于 2011-07-07T15:37:00.263 に答える
3

この例は、liftフレームワーク(spec)にあります。

import net.liftweb.utils.TimeHelpers._
3.minutes == 6 * 30.seconds

(注:正しく比較するには、妥当な数値が必要なようです。たとえば、60秒以内である可能性があります。)

于 2011-07-07T15:31:09.637 に答える
2

Scala -timeを試してみてください。これは、 Joda Timeのラッパーであり、Brian Agnewが彼の回答で提案したのと同様に、期間計算を行うDSLを含め、Scalaにとってもう少し慣用的なものになります。

例えば、

2.hours + 45.minutes + 10.seconds

Jodaを作成しPeriodます。

于 2011-07-07T21:58:32.340 に答える
1

ここではDSLが役立つように思えます。だからあなたは書くことができます

2.hours - 5.minutes

そして、適切な変換が行われ、2時間をHoursオブジェクト(値2)などに変換します。

ScalaのDSL機能を説明する多くのリソースが存在します。たとえば、オライリーからこれを参照してください

于 2011-07-07T15:31:47.643 に答える