G-d willing
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
Thanks,
(+) and (==) 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 Eq and 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 == 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 +' and ==' as where appropriate.