Hello, I would like to extend the capabilities of math operators in such a way that it will automatically convert different numerical values. For example, I would like to extend the
+ operator so when I add to Decimal value an Int Value I won’t need to call a specific function that receives a Decimal and Int arguments and returns a Decimal.
The same I would like to do to the
== operator (The
Eq typeclass) so when I compare a Decimal 5.0 to Int 5 it will return True. Like so:
let fiveD = 5.0 : Decimal
let fiveI = 5
debug $ fiveD == fiveI
(==) are defined in
Prelude. Modifying prelude is possible, but I’d strongly advise against it as if you get it wrong, a lot of things break.
You’d need to use a language extension like
NoImplicitPrelude and then import your own prelude everywhere. You’d need to define new versions of the
Additive typeclasses that don’t define
== : a -> a -> Bool and
+ : a -> a -> a, but
== : a -> b -> Bool and
+ : a -> b -> c, and then write instances for those typeclasses to both cover the standard
== and your new uses.
A better approach would be to define your own typeclass
class CompatibleNumerics a b c where
(+') : a -> b -> c
(==') : a -> b -> Bool
Then write lots of instances and use
==' as where appropriate.