6 ms·
I think this is a great question because it tends to come up a lot. What do you call the following common operations? - 1 + 0 - 1 * 1 - "string" ++ ""
by bojo 6y ago
I think this is a great question because it tends to come up a lot.
What do you call the following common operations?
- 1 + 0
- 1 * 1
- "string" ++ ""
- [1, 2, 3] ++ []
As far as I know there is no term for this grouping of operations outside of functional programming languages which use category theory.
We call it a "monoid" based on the following precise definition:
> In abstract algebra, a branch of mathematics, a monoid is an algebraic structure with a single associative binary operation and an identity element[1].
I used the "identity element" specifically in my examples above since they tend to be a good way to grasp what is going on.
It turns out a "functor" has more properties than just being "mappable", which is why we like using the more precise term in our literature. However, it's still a decent intuition if you aren't familiar with the concept.
For example, in the parent comment the 'f' in the second line of code shows that it is some kind of structure that adheres to a Functor, and also infers that this structure can also be mapped over. This is a nice property because without caring about the implementation, we can still do functor-specific operations over abstract structures.
[1] https://en.wikipedia.org/wiki/Monoid https://en.wikipedia.org/wiki/Monoid
- pacala 6y agoconcat?
- JoshuaDavid 6y agoI can't think of any way for 1 * 1 to be concatenation. I think the point GP was making is that a monoid has something to do with a function f that takes two arguments a and b where there is a single value for b such that f(a, special_value) == a. I think. As someone who doesn't really understand FP concepts I would probably call those functions "functions that can sensibly be used in a call to array.reduce"
- pacala 6y agoIt doesn't need to have a perfect metaphor for all possible cases, just something you can picture in an instant: 'behaves like a concating variable length box sequences'. It's a mnemonic / learning aid, not a formal spec. But I can stretch it :) +: concat marbles sequence * : concat prime factors sequence ++: concat box sequence For * , it can also be reduced to + via logarithms. I just don't have a good metaphor for '+ over reals' this morning.
- diegoperini 6y ago> I just don't have a good metaphor for '+ over reals' this morning. Skimming through my thesaurus, I found a word for it: "Totalize".
- chas 6y ago“append”* is the name chosen for the binary operator in the Haskell standard library’s monoid abstraction and “concat” seems like the same genre, so I would expect people would be fine with the intuition for “concat” as well. Given that this is a thread on functional jargon, it might be interesting to note list metaphors as being useful for thinking about monoid might derive from lists being free monoids (in many contexts). This means that all functions from a collection elements to a monoid can be thought of as functions from that collection into a list with the appropriate type of elements and then a fold (also called a reduction) over that list. This knowledge can be super useful for thinking about program structure e.g. conceptually mapreduce is a general tool for large-scale distributed computation over monoids. *it’s actually called “mappend”[0], short for monoid append, but I think the point still stands (and there is, in fact, a function called “mconcat”[1] but folds of a list of monoidal values using “mappend” to combine them.) [0] http://hackage.haskell.org/package/base-4.14.0.0/docs/Data-Monoid.html#v:mappend http://hackage.haskell.org/package/base-4.14.0.0/docs/Data-M... [1] http://hackage.haskell.org/package/base-4.14.0.0/docs/Data-Monoid.html#v:mconcat http://hackage.haskell.org/package/base-4.14.0.0/docs/Data-M...
- jimbokun 6y ago> As someone who doesn't really understand FP concepts I would probably call those functions "functions that can sensibly be used in a call to array.reduce" So reduceables?
- dllthomas 6y agoThat implies that they can be reduced. Maybe "reductors"? That said, I am on the "name abstractions after the math" side of things. It makes it much clearer what guarantees I have when working with the interface, on either side of it.
- centimeter 6y ago> "functions that can sensibly be used in a call to array.reduce" You can use any function you want in a fold in Haskell. You're conflating two typeclasses, Monoids and Foldables, and restricting yourself to the function known in Haskell as foldMap.
- bojo 6y agoYou've definitely got the right intuition. "associative": (a + b) + c == a + (b + c) "binary": f a b == a `f` b == a + b where f is addition "identity element": the "empty" value which when paired with a second value, returns the second value as is
- twic 6y ago"binary operators with an identity value"
- wLMeOv2qjsFOjZG 6y agothe binary operation should also be associative (e.g. subtraction is no good)