{
"$type": "site.standard.document",
"bskyPostRef": {
"cid": "bafyreifqvynwerzopsxq3wh2wh4pxlbjp5rd465ot5k6p473s6uomvqp54",
"uri": "at://did:plc:pi6woz4d47bkuws673w2il2r/app.bsky.feed.post/3mgylkemxogr2"
},
"path": "/t/sneak-peek-bolt-math/13766#post_15",
"publishedAt": "2026-03-13T18:07:35.000Z",
"site": "https://discourse.haskell.org",
"textContent": "I am not saying that that we can’t benefit from describing things as acts; and maybe even that is how we end up ‘sealing’ some things away. But, the thing I said about parallel concepts, applies here to how we handle this problem too - I think perhaps we can quite easily overlay said classes over the heterogenous definition, and that they are not necessarily mutually exclusive.\n\nWedge product, geometric product, really anything involving projecting across dimensions. Its not even that it is heterogenous, its that they become (I dont know how to put this formally) polymorphically heterogenous and homogenous at the same time. What does that even mean? I mean vectors are blades are grades are multivectors and I can wedge _any_ of them together, because they are hypothetically subsets of the same construct, but the homogenous representation (multivectors) requires 2^n components, most of which will be empty and useless, infrequently used, and slow when it is used. Also, despite being ‘the same thing’ they are all also their own thing with distinct properties and uses (vectors volumes rotors and motors are all quite different things, even if they are ‘representable’ as a multivector).\n\nHeterogenous types actually let me use type families to differentiate and automatically dispatch to a fast implementation - so when I have 10 dimensions in double conformal space, I don’t need to lift things to 2^10 = 1024-dimensional vectors. Using acts doesn’t solve this I think - I’d need to define an act instance for every combo of every dimension of blade and grade and multivector. So, acts are orthogonal to some aspects of the problems I am trying to solve, while heterogenity is not!\n\n * I was surprised by this too, I had actually been trying to improve `Num` for years with no meaningful movement forward - even using acts (I used to be so concerned with that very separation). Heterogenity let me move forward.\n\n\n\nSo, describing them as acts is a complication at the moment and the heterogenous math is lubrication - at least for me, and as I am the one writing the library I want to see where it leads.\n\n* * *\n\nConsider that an act, is a specialized heterogenous operation, not unlike how a homogenous operation is specialized. The benefit that you seek, may not be from the specialization **as an act** , but from the **specialization** as an act. With this philosophy, I see no reason acts shouldn’t be included if homogenized specializations are; therefore my goal should be to ensure that they have appropriate separation as to not inhibit any other classes, but be well-integrated enough and included as to provide an optional benefit.\n\n* * *\n\nAlso, the trivial example is wedging simple vectors: `wedge :: v -> v -> Bivector v` - not an act. Not a homogenous relation either. Is this a sufficient example?\n\nAddendum: Going further: Because wedging increases the grade, wedging is _never_ an act, **except with scalars** , because `wedge :: Grade i v -> Grade j v -> Grade (i + j) v`, and so wedge is only an act when one of grades is 0 aka its a `Scalar v`, which is when wedging reduces down to / becomes precisely equivalent to standard (Grade k-) vector-scalar multiplication.",
"title": "Sneak Peek: Bolt Math"
}