News for hackers. Stuff that matters.
Re:C++17: I See a Monad in Your Future by Pacabel on Thursday February 27, 2014 @05:59PM (#7315875)
Your examples are either at the extreme of literalness, or at the extreme of abstractness.

The most useful name is probably somewhere in the middle. It may not necessarily consist of everyday words, but it probably relates very obviously and clearly to the C++ functionality.

"Monoid" is a very detached term. It doesn't obviously relate to the C++ construct or concept the way that terms like "typedef", "template", "stream" and so on do for other constructs/concepts.

Re:C++17: I See a Monad in Your Future by jroesch on Thursday February 27, 2014 @07:02PM (#7316294)
Not really I've had Java developers look me in the face and say that the nonsense names (very much like the one above) that Spring uses are somehow more readable than simple operators or abstract names.

Monoid is NOT a detached term it says I have a type with an identity element, and an associative binary operator, and that that (id `op` elem) always is elem. Try to tell me that i complicated in the slightest. I can most definitely not give you a single line description of templates, or most C++ features. Abstraction makes things more general (i.e less specific) meaning it is easier to describe, reason about, and discuss because I can only talk about things that hold universally.

If you doubt me let's show some things that form a Monoid right now, and how easy it is to define.

1) Strings - identity element = "" - associative operator = +

2) Lists - identity element = list<A>() //empty list - associative operator = concat

and we can go on and on finding instances of Monoids simply from a one line description.

Re:C++17: I See a Monad in Your Future by jeorgun on Thursday February 27, 2014 @09:04PM (#7316789)
Monoid is NOT a detached term it says I have a type with an identity element, and an associative binary operator, and that that (id `op` elem) always is elem. Try to tell me that i complicated in the slightest.

Just for the record, I'd like to state that I couldn't make heads or tails of this explanation. 'Identity element', when thinking of C++, just makes me think of a hash function or something.

Looking at the examples, it's sort of clearer— a monoid is a type that can hold a value that's empty (or zeroed, or whatever). But that doesn't change the fact that that explanation (and the term 'monoid') is so firmly rooted in math jargon that it's basically incomprehensible to someone used to thinking in C++.

Re:C++17: I See a Monad in Your Future by freyrs3 on Friday February 28, 2014 @12:43AM (#7317414)
> is so firmly rooted in math jargon that it's basically incomprehensible to someone used to thinking in C++.

It's firmly rooted in like 5th grade math. Every child in the US that takes basic algebra in school learns about identities and identity rules like "0+x=x" or "1*x=x" or in pseudocode as something like "(id `op` elem)=elem".

Re:C++17: I See a Monad in Your Future by shock-value on Friday February 28, 2014 @03:21AM (#7317690)
Every child certainly doesn't learn the term "monoid" though. The issue here isn't the concept; it's the terminology.

Possibly, C++ should adopt the name anyway, but it's by no means a commonly used or understood term by most users of C++. As has been mentioned, C++ is above all a language whose design is driven by pragmatism, so if another more common term can be found for the idea of a monoid you can bet it'll be preferred (even at the expense of some literary accuracy).

Re:C++17: I See a Monad in Your Future by Pacabel on Thursday February 27, 2014 @07:24PM (#7316418)
I'm not sure that Java programmers are necessarily the best judges of good naming conventions. I've personally witnessed several of them immediately mention "gonads" when first hearing the term "monad".

For most C++ terminology, you don't need to give a single-line description. The keyword or concept name alone generally embodies that information very well. To use your example, at a basic level a C++ "template" is quite similar to a form letter, stencil or other real-world "templates". It's a predefined mold that you inject your specific information/material into to get a final product with minimal effort.

There just isn't a direct relation back to the real world with a term like "monoid". You end up with people who are confused at best, or more likely they're thinking of some other word that sounds similar but is totally unrelated.

Re:C++17: I See a Monad in Your Future by eru on Thursday February 27, 2014 @08:50PM (#7316740)
> There just isn't a direct relation back to the real world with a term like "monoid".

And that might even be a good thing. The stencil analogy for C++ templates gives you a warm fuzzy feeling, but doesn't actually help you program. Contrast: the one line definition of Monoids is all there is to them. That's all there is to know about Monoids.

Re:C++17: I See a Monad in Your Future by dllthomas on Thursday February 27, 2014 @09:05PM (#7316793)
Monoid is a semigroup with an identity, and also a group without inverses. Learning a small amount of algebra shouldn't be scary, and the vocabulary will help you in countless mathematical fields - many of which touch directly on programming.
Re:C++17: I See a Monad in Your Future by username223 on Thursday February 27, 2014 @11:03PM (#7317180)
> Monoid is a semigroup with an identity, and also a group without inverses.

Classic. Sometimes Haskell fans have useful things to say, and sometimes they're just using terminology to try to win an intellectual dick-size war. The tricky part is telling the two apart.

Re:C++17: I See a Monad in Your Future by dllthomas on Thursday February 27, 2014 @11:22PM (#7317232)
It's basic abstract algebra - this is literally stuff I learned in a math class 12 years ago. It's used in hojillion papers, some abstract and some concrete and highly relevant to real world problems (including encryption and linear algebra - both of which can be directly useful to programmers), and they're not even hard. Just learn some math - this is undergrad stuff.
Re:C++17: I See a Monad in Your Future by Pacabel on Friday February 28, 2014 @05:50PM (#7322079)
The concepts themselves aren't difficult to understand. It's just that some people go out of their way to use uncommon terminology that ends up obscuring what they're trying to say, rather than making it clearer.
Re:C++17: I See a Monad in Your Future by dllthomas on Friday February 28, 2014 @06:40PM (#7322293)
Is there more common terminology for "a set with a binary operation that is associative and has an identity"?
Re:C++17: I See a Monad in Your Future by freyrs3 on Friday February 28, 2014 @06:57PM (#7322356)
Any name that we'd come up either wouldn't capture the general case or would be just as arbitrary as Monoid ( ignoring historical usage). The gist of this argument is that Pacabel and the like can't describe the concept using the traditional OOP evocative naming style but insist that term "Monoid" is wrong because of some irrational aversion to terms from abstract algebra. There's really nowhere for this argument to go...

Imagine trying trying to describe a monoidal category or topoi in the OOP style, it's like trying to describe what a Fourier transform is to someone who insists on using roman numerals.

Re:C++17: I See a Monad in Your Future by username223 on Saturday March 01, 2014 @09:09PM (#7327334)
> it's like trying to describe what a Fourier transform is to someone who insists on using roman numerals.

Or describing Latin declensions to someone who reads kanji. The key is that, if the audience admires Latin speakers, you can appear smart.

Re:C++17: I See a Monad in Your Future by freyrs3 on Friday February 28, 2014 @12:07AM (#7317343)
You're right, why use precise language to describe abstract concepts when we could just communicate knowledge using longform metaphors and cryptic analogies. Or maybe we could just grunt at each other like animals.
Re:C++17: I See a Monad in Your Future by voyou on Friday February 28, 2014 @06:14AM (#7318124)
It's good to use precise, specialised language to communicate with other people who are familiar with that specialised language. Using specialised language to "explain" another piece of terminology from the same specialised vocabulary, though, doesn't create the impression of someone who is genuinely interested in communication.
Re:C++17: I See a Monad in Your Future by chongli on Thursday February 27, 2014 @06:20PM (#7316003)
It may not necessarily consist of everyday words, but it probably relates very obviously and clearly to the C++ functionality.

Such as?

"Monoid" is a very detached term. It doesn't obviously relate to the C++ construct or concept the way that terms like "typedef", "template", "stream" and so on do for other constructs/concepts.

Well of course! Monoid is far more general than those other concepts. It's also a far better name, being unambiguous. Those other names are reused all over the place in different contexts and their meanings subtly shift between their uses. Monoid is not so overloaded; once you learn it, you know what it means every time you encounter it.

Re:C++17: I See a Monad in Your Future by Pacabel on Thursday February 27, 2014 @06:45PM (#7316182)
I'm not going to claim to have a better name at this moment.

However, I would like to think that there's somebody out there who could come up with a name that describes the concept sufficiently, while still using pragmatic C++-style terminology.

All I'm saying is that "monoid" is terminology of a style that's very different from basically all other C++ terminology. To many C++ programmers, even those with a background in mathematics, it's no better than gibberish.

At least the existing C++ keywords and terminology tend to be far more descriptive of what they're referring to, even if there is ambiguity in some cases. This is true even for the more abstract concepts in C++.

Re:C++17: I See a Monad in Your Future by chongli on Thursday February 27, 2014 @06:54PM (#7316237)
"Monoid" is a very detached term.

What does that mean? How is it any more detached than object or method?

Re:C++17: I See a Monad in Your Future by Pacabel on Thursday February 27, 2014 @07:12PM (#7316344)
Both "object" and "method" are common words with very obvious parallels between the programming language concepts and similar real-world concepts that are familiar to basically everyone. That's what makes them good terminology.

An "object" is something specific that exists (implying it can likely also be created and destroyed), and can be distinguished from other objects. This applies equally well to a combination of a data structure and some related code as it does to a tennis ball, or to a car, or to a book.

A "method" is a systematic way of doing something. That "something" could be the operations described by some source code, or it could be tying a shoe, or even brushing one's teeth.

"Monoid" has no good real-world parallel. It has no related or relevant meaning outside of very, very specific contexts. That's what makes it "detached". It's off on its own, with an isolated and non-obvious meaning.

Re:C++17: I See a Monad in Your Future by dllthomas on Thursday February 27, 2014 @09:07PM (#7316807)
'"Monoid" has no good real-world parallel. It has no related or relevant meaning outside of very, very specific contexts. That's what makes it "detached". It's off on its own, with an isolated and non-obvious meaning.'

It's jargon, but it's jargon shared across a few fields, which makes it more worth learning. And while it lacks a "real-world parallel" it has a lot of simple examples. Lists over concatenation, integers over addition, positive integers over max, negative integers over min... It's interesting and informative to observe why integers over max (or min) is not a monoid but is a semigroup.

Re:C++17: I See a Monad in Your Future by freyrs3 on Thursday February 27, 2014 @08:13PM (#7316598)
If you limit yourself to concepts you can express by relating them to the physical-world objects and human actions then you lack the language to express abstract concepts entirely. The words used by mathematicians are chosen to describe these structures have no real-world connotations because the ideas, in their-full generality, have no representation in our every-day experience. There's no way you'll ever be able to describe any reasonably complex structure from abstract algebra by concatenating a bunch of household adjectives, it doesn't capture the full-generality or convey any more information.
Re:C++17: I See a Monad in Your Future by devwebee on Thursday February 27, 2014 @08:58PM (#7316765)
So what kind of object is a multiplication, or an addition? Monoid has "no real good real-world parallel" because it is not a real-world concept. -- "It has no related or relevant meaning outside of very, very specific contexts" -- Well, that's the very nature of these abstractions; they apply to many many contexts, when working with data.
Re:C++17: I See a Monad in Your Future by eru on Thursday February 27, 2014 @08:48PM (#7316728)
You are being too optimistic about object and method. (They look familiar because of long exposure to OOP.)

The Haskell people share your concerns. Simon Peyton Jones famously suggested "our biggest mistake [in designing Haskell was u]sing the scary term 'monad' rather than 'warm fuzzy thing'". (https://research.microsoft.com/en-us/um/people/simonpj/paper...).

Re:C++17: I See a Monad in Your Future by dllthomas on Friday February 28, 2014 @01:02PM (#7320359)
'"Monoid" has no good real-world parallel. It has no related or relevant meaning outside of very, very specific contexts. That's what makes it "detached". It's off on its own, with an isolated and non-obvious meaning.'

Also, this objection would seem to apply equally well to functions and variables as monoids.

Re:C++17: I See a Monad in Your Future by Pacabel on Friday February 28, 2014 @05:47PM (#7322067)
I wouldn't say so. "Function" is a pretty common term used to refer to somebody doing some specific task. There's an obvious correlation between an employee tasked with a carrying out a specific role or action, and a chunk of source code that does something specific.

And the same holds true for "variable". It's a very common term for things that change their state of being, including stuff that isn't directly related to programming or mathematics. Stuff like the weather, somebody's mood, and so on.

"Monoid" just doesn't have any everyday meaning like those terms do, especially a meaning that so closely resembles the programming concept like in the case of "function" and "variable".

Re:C++17: I See a Monad in Your Future by chongli on Friday February 28, 2014 @06:33PM (#7322272)
The everyday meanings of these words are misleading when applied to the context of a particular programming language. Variables in one language are not at all related to variables in another. Mathematical variables, for example, do not change at all. Similar differences exist for functions and objects. These highly-overloaded terms are a constant source of confusion for people trying to learn different programming languages.

Monoid, on the other hand, has no such problem. If you look it up, its meaning in mathematics directly translates to its meaning in Haskell.

Re:C++17: I See a Monad in Your Future by dllthomas on Friday February 28, 2014 @06:56PM (#7322353)
"These highly-overloaded terms are a constant source of confusion for people trying to learn different programming languages."

Yeah, they mean yet something else in statistical software.

Re:C++17: I See a Monad in Your Future by BartoszMilewski on Friday February 28, 2014 @01:32PM (#7320568)
Do you mean names like RAII? I always break my tongue on this one.
Re:C++17: I See a Monad in Your Future by freyrs3 on Thursday February 27, 2014 @06:29PM (#7316069)
The former was chose to make a point, but I contest the fact that Monoid is extremely abstract. It's very concrete, it effectively describes an interface and if implemented according to certain laws it is a Monoid just like a Container or Iterator. The name has existed for nearly a hundred years in mathematics, it relates very obviously to any data structure that is a monoid.
Re:C++17: I See a Monad in Your Future by Pacabel on Thursday February 27, 2014 @06:59PM (#7316275)
Perhaps the problem is that there's no good real-world equivalent of a "monoid" that basically everybody is familiar with.

Most people are inherently familiar with the concept of a "container", in the sense of something that holds other things, regardless of whether it's a physical container or a data structure.

"Iterator" might not be as clear as "container", but at least most people are familiar with the concept of doing something repeatedly, whether it's some physical action or executing some chunk of source code.

"Monoid" just isn't like that. It may be concrete when constrained to the context of mathematics or programming, but it's quite meaningless outside of those very specific contexts.

Re:C++17: I See a Monad in Your Future by voyou on Friday February 28, 2014 @05:24AM (#7317957)
"the problem is that there's no good real-world equivalent of a "monoid" that basically everybody is familiar with."

But that isn't really true. Addition and multiplication are both real-world examples of monoids that everyone is familiar with (obviously, these aren't physical things, but I don't see why that's relevant).

Re:C++17: I See a Monad in Your Future by voyou on Friday February 28, 2014 @09:30AM (#7318825)
Just realised I may have missed your point; anyway, you're right that "monoid" is harder to find an easily-understood counterpart for than "container". There are examples of monoids which everyone is probably familiar with, but we don't usually abstract from those everyday examples; whereas as well as there being everyday examples of containers (boxes, bags), we are familiar with abstracting away from those examples in everyday life to come up with the general concept of container.
Re:C++17: I See a Monad in Your Future by dllthomas on Friday February 28, 2014 @06:50PM (#7322340)
"typedef" is one of the most misleadingly named constructs in the language. You can "define a type" without it, it just changes how things are tokenized. Giving it as an example of good naming is weird.