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 ( 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 : * [...] * 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.