2 Stimmen

Typ parametrisierte Arithmetik?

Ich versuche, eine Möglichkeit zu finden, 5 Minuten von 2 Stunden abzuziehen.

Es macht keinen Sinn, 5 von 2 zu subtrahieren, da wir dann -3 allgemeine Zeiteinheiten erhalten, was nutzlos ist. Aber wenn "Stunde" ein Untertyp von "Minute" ist, könnten wir 2 Stunden in 120 Minuten umwandeln, was 115 Minuten oder 1 Stunde und 55 Minuten ergibt.

Auch wenn wir 5 Äpfel zu 5 Orangen addieren wollen, können wir dies nicht in Äpfeln bewerten, sondern erwarten, dass wir 10 Früchte erhalten.

Es scheint, dass in den obigen Beispielen und generell bei der Verwendung einer Zahl als Adjektiv, die ganzen Zahlen durch den Typ des Objekts, das sie beschreiben, parametrisiert werden müssen. Ich denke, es wäre sehr nützlich, wenn statt der Deklaration von

val hours = 2
val minutes = 5

könnten Sie etwas tun wie

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

Gibt es so etwas, wäre es nützlich und könnte man es einführen?

EDIT Um das klarzustellen: Das obige Zeitbeispiel ist nur ein zufälliges Beispiel, das ich mir ausgedacht habe. Meine Frage ist eher, ob im Allgemeinen die Idee der parametrisierten Numerics ein nützliches Konzept ist, so wie Sie parametrisierte Listen usw. haben (die Antwort könnte "nein" sein, ich weiß es nicht!)

6voto

Dan Simon Punkte 12543

Sie können dies erreichen, indem Sie zwei Klassen für Stunden und Minuten sowie eine implizite Konvertierungsfunktion von Stunden in Minuten haben

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)

So können Sie zum Beispiel Folgendes tun

val h = Hour(2) - Minute(30) //returns Minute(90)

3voto

Debilski Punkte 65106

Einige Beispiele hierfür finden Sie im Aufzugsrahmen ( spec ).

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

(Hinweis: Für einen korrekten Vergleich müssen Sie vernünftige Zahlen haben. Es dürfen z. B. nicht mehr als 60 Sekunden sein).

2voto

Don Roby Punkte 39870

Sie könnten versuchen scala-Zeit die eine Umhüllung ist für Joda Zeit und macht es etwas idiomatischer für Scala, einschließlich einer DSL für Zeitspannenberechnungen, ähnlich wie es Brian Agnew in seiner Antwort vorgeschlagen hat.

Zum Beispiel,

2.hours + 45.minutes + 10.seconds

schafft eine Joda Period .

1voto

Brian Agnew Punkte 260470

Mir scheint, dass ein DSL hier von Nutzen wäre. Sie könnten also schreiben

2.hours - 5.minutes

und die entsprechenden Konvertierungen würden stattfinden, um 2 Stunden in ein Hours-Objekt (Wert 2) umzuwandeln usw.

Es gibt viele Ressourcen, die die DSL-Fähigkeiten von Scala beschreiben, z.B. siehe dies von O'Reilly

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X