[Haskell-beginners] How would you implement Instant and Interval
Daniel Bergey
bergey at alum.mit.edu
Tue Oct 27 20:40:29 UTC 2015
On 2015-10-27 at 13:53, martin <martin.drautzburg at web.de> wrote:
> Hello all
>
> If I define an Instant as a point in Time and an Interval as the difference between two Instants, and I also want to use
> (+) and (-), how can I do this.
>
> My initial thought making them instances of the Num class, but that does not work. (-) is okay on Intervals, but on
> Instant it returns a different type (Interval).
>
> Is it possible at all to define a typeclass with (-) :: Instant -> Instant -> Interval without using language extensions?
I think you are asking for the same type class function to have
the types
`Instant -> Instant -> Interval`
and
`Interval -> Interval -> Interval`
for two different instances. I don't believe this is possible without
language extensions. Below is an example of doing it with
TypeFamilies. If I actually wanted this, I'd probably use the Affine
class from linear[1] or vector-space[2] instead of the Sub class I
define here. At any event, I don't think I'd want to give up on using -
in it's normal meaning of Num, in order to use it for Time and Interval.
newtype Time = Time Double deriving Show
newtype Interval = Interval Double deriving Show
class Sub a where
type Diff a
(.-.) :: a -> a -> Diff a
instance Sub Time where
type Diff Time = Interval
(Time a) .-. (Time b) = Interval (a - b)
instance Sub Interval where
type Diff Interval = Interval
(Interval a) .-. (Interval b) = Interval (a - b)
Footnotes:
[1] http://hackage.haskell.org/package/linear-1.20.2/docs/Linear-Affine.html
[2] http://hackage.haskell.org/package/vector-space-0.10.2/docs/Data-AffineSpace.html
More information about the Beginners
mailing list