I only superficially read this question–but it does make me think of
coercing input types

https://docs.raku.org/language/functions.html#Coercion_types
https://stackoverflow.com/questions/34874779/what-is-the-point-of-coercions-like-intcool

If the methods that do the adding-of-magmas were written with coercion,
would you still want to monkey-type the built-ins?

method add(AddMagma(Cool):D, AddMagma(Cool):D) of AddMagma:D {...}

-y


On Sat, Aug 8, 2020 at 8:05 PM Stuart Hungerford <
stuart.hungerf...@gmail.com> wrote:

> Hi,
>
> I'm creating some Raku roles that model algebraic structures:
>
> role AddMagma {
>   method add(AddMagma:D, AddMagma:D) of AddMagma:D {...}
> }
>
> role AddSemigroup does AddMagma {
>   multi method add-associativity(AddSemigroup:D \x, AddSemigroup:D \y)
> of Bool:D {
>     self.add(x.add(y)) == (self.add(x)).add(y)
>   }
> }
>
> All the built-in numeric types are (ignoring floating point issues)
> additive magmas and additive semigroups. So my first thought was to
> monkey type the appropriate classes to do these roles:
>
> use MONKEY-TYPING;
>
> augment class Int does AddMagma {
>   method add(Int:D \x) of Int:D {
>     self + x
>   }
> }
>
> augment class Int does AddSemigroup {}
>
> # and similar for other built-in types.
>
> Then I can test the structure properties with built-in numeric values:
>
> say "Int addition is associative: ", 42.add-associativity(43, 44);
>
> BUT: monkey typing like this is frowned upon (with good reason no doubt)
> and can't be done on numeric roles like Numeric, which are "sealed".
>
> Would a better approach be to create custom subtypes of the built-in
> numeric types that mixin the algebraic roles? Is there an idiomatic way
> avoid boilerplate code in creating instances of these custom subtypes?
>
> Any advice much appreciated,
>
> Stu
>

Reply via email to