[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Idiomatic Guile for semigroup/monoid/group?
From: |
Maxime Devos |
Subject: |
Re: Idiomatic Guile for semigroup/monoid/group? |
Date: |
Sun, 02 Jan 2022 10:46:43 +0000 |
User-agent: |
Evolution 3.38.3-1 |
Stuart Hungerford schreef op zo 02-01-2022 om 10:45 [+1100]:
> In Haskell/Idris/Purescript/Swift/Rust I'd be looking to
> typeclasses/protocols or traits to model a semigroup, monoid or group.
> In OOP languages I'd be looking to some kind of abstract base class to
> model each structure.
>
> What would the idiomatic Guile forms be to work with these structures?
> Would it involve GOOPS or records?
I wouldn't recommend using GOOPS methods, because a carrier set can
have many groups.
E.g., on the rational numbers (<rational> in GOOPS), both the
multiplication group and the addition group can be defined, but they
aren't isomorphic. (I'm ignoring 0 here)
My suggestion is to do as Haskell does, but make type class instances
explicit.
E.g., in Haskell one could define exponentiation (multiplicative) /
repeated addition (additive, not sure about standard terminology) as
something like
-- Not sure about the exact syntax, it has been a while!
exp :: Group G => Integer -> G -> G
exp 0 _ = identity
exp (+ 1 n) g = g * exp n g
This can be made more explicit:
-- first argument: identity element
-- second argument: function inverting an element
-- third argument: multiplication
data Group G = Group G (G -> G) (G -> G -> G)
identity :: Group G -> G
identity = _ -- maybe shorten to 'id'
mult :: Group G -> G -> G -> G -- maybe shorten to '*' in Scheme
mult = _
inverse :: Group G -> G -> G -- maybe shorten to '⁻¹' in Scheme
exp :: Group G -> Integer -> G -> G
exp gr 0 _ = identity gr
exp gr (+ 1 n) g = mult gr g (exp gr n g)
The downside is that passing all these 'Group G' objects around
might be a bit tedious.
Anyway, possibly things like this are already implemented in Theme-D
(not sure though): looking at the properties of Theme-D listed at
<https://www.tohoyn.fi/theme-d/>:
* [...]
* Static type system
* An object system
* A module system
* *Statically* and dynamically dispatched multimethods (emphasis mine)
* Parametrized (type parameters) classes, types, and procedures
* [...]
* Numeric tower
* [...]
Greetings,
Maxime.
signature.asc
Description: This is a digitally signed message part