I think that "Instant" and "Duration" should simply be declarational roles that don't have any implementation code to compose.

Composing "Instant" or "Duration" into a type simply says that the objects of that type represent a point on a timeline or an amount of time.

Specific units, even "seconds" should not be mentioned at all in the definition of "Instant" or "Duration"; instead, any particular units or calendars or whatever would just be a property of the composing class.

Said 2 roles would *not* specify that values would numify or strify or boolify in any particular way, such as seconds or otherwise; this is strictly a property of the composing class.

Said 2 roles could define particular methods such as, assuming we're just talking one-dimensional:

  Instant - Instant --> Duration

  Instant + Duration --> Instant
  Instant - Duration --> Instant

  Duration + Duration --> Duration
  Duration - Duration --> Duration

  Duration * Numeric --> Duration
  Duration / Numeric --> Duration

  Duration / Duration --> Numeric (rational in general)
  Duration div Duration --> Numeric (integral)
  Duration mod Duration --> Duration (rational in general)

I don't see that multiplying a Duration, or having arbitrary exponentiation, makes any sense when talking one-dimensional, especially when we're being completely units-agnostic. A specific implementing type may have a concept of dimensionality, but I would think that these 2 roles don't.

Perhaps a suitable analogy is to look at the level of abstraction that "Numeric" has relative to composing classes.

Do we want Instant and Duration to include concepts like dimensionality, such as like Numeric may include Complex, or do we want it to explicitly be one-dimensional (though units agnostic), like Real?

And whatever choice we pick, maybe there should be suitable generic names given to the complementary concept of what I mentioned.

-- Darren Duncan

Reply via email to