[HN Gopher] What does it mean for a monad to be strong? ___________________________________________________________________ What does it mean for a monad to be strong? Author : chmaynard Score : 32 points Date : 2023-08-21 18:49 UTC (4 hours ago) (HTM) web link (blog.sigfpe.com) (TXT) w3m dump (blog.sigfpe.com) | koolala wrote: | In my own personal monad opinion, the 'strongest' idea of a monad | to me is just a function or program. | | monad 1 | monad 2 | monad 3 | | It doesn't have to be complicated. | Sharlin wrote: | The whole point of the article is that the right-associativity | of Haskell monads makes them not simple pipelines because it | allows this: a -> b -> c \_______^ | | so c gets the results of both a and b "for free". | koolala wrote: | So how do you generalize this idea to programs and functions? | My framing is "incorrect" I think but it feels far easier to | reason about. | | Couldn't this same idea be applied generically to all | computer programs? Could its valuable situational properties | ever be done in a way that is language neutral with arbitrary | program monads? | kfixjviv wrote: | The main reason that monads are restricted to fancy | languages like Haskell is that the type system has to | support their definition. | | There are some examples of attempted implementations the | list monad in other languages on RosettaCode | https://rosettacode.org/wiki/Monads/List_monad | | Caveat emptor, though. A lot of that page is erroneous. | | A few years ago I fixed up the definition for F#, which is | perhaps the closest thing to a language for ordinary Joes | in which true monadic style can be defined/achieved. | MaxRegret wrote: | I think the article is an attempt to make your idea more | precise. What if monad 3 could use the result of monad 1, not | just monad 2? Then you couldn't write that computation using | your pipeline metaphor. | | The article is saying that by judicious use of a "strength" | function, you can in fact write any monadic computation as such | a pipeline (or composition of monadic functions). | koolala wrote: | If my example of pipeline is a limited metaphor, couldn't it | be expanded? | | I love this subject but it's traditionally over-complex, so I | appreciate the correction and explaination. | | How could "strength" be applied generically to programs | outside of Haskell? Could the concept of pipelines be | extended? Is programming too 1 dimensional? There must be | ways to do this. | hgsgm wrote: | So, strength is the ability to write a monad-related function you | can define if you need to, like any other function you might | write that had a monad argument. But you can't not in math | monads, for reasons not explained. | | I don't see how this helps anyone. | | What is different about a math monad that makes strength no | available, and why is that interesting? | | How would you create a non-strong monad in Haskell, and why might | you want to, or is it impossible? | | Seems to lean to much on a sort of false connection between | Haskell and math, where two similar but different things have the | same name. | bPspGiJT8Y wrote: | > How would you create a non-strong monad in Haskell, and why | might you want to, or is it impossible? | | I think the article implies it clear enough that it's | impossible. Even if your monad has nonsensical (but lawful) | semantics like `Proxy t` it's still possible to use it with | `strength`. BTW the `strength` function is called `sequence`. | kfixjviv wrote: | Haskell's sequence is not the same as strength. Strength | specifically involves pairs. | | Nobody seems to know where "strength" got its opaque name | from. Like, nobody, not even the guy who first published the | term. | | There is another article on the topic here: | | http://comonad.com/reader/2008/deriving-strength-from- | lazine... | MaxRegret wrote: | I agree that it would be interesting to learn what non-strong | monads look like. But the blog post does (implicitly) answer | some of your questions: | | It says that all monads in the Set category are strong. That | would include Haskell monads, at least those expressed in the | usual way as type constructors, to the extent that Haskell | types model sets. | | And you can see that the "strength" operation relies on the | existence of tuples behaving like Cartesian products of sets. | Such objects might not exist in other categories. | mkoubaa wrote: | "I don't see how this helps anyone" is my gut response to | anything related to the m-word | mgaunard wrote: | Monads are just a way to bind a continuation to an | expression. | | The only reason they sound special is the silly name and the | inane Haskell syntax. | throwaway17_17 wrote: | I find this to be an odd take. Monads, even when restricted | to programming language usage, do not fundamentally have | anything to do with continuations. There is a Continuation | Monad in Haskell, but that is just one implementation of | one example of a monad. | | I'm not particularly sold on the Ur-importance of monads in | programming, but I don't get using such a specific | implementation to deride the concept. Monads are an | algebraic structure, application in programming languages | is akin to using sum types to form enumerated data. | tikhonj wrote: | As a wild guess, this same construct might not always work with | linear types--if we had to use x exactly once, we wouldn't | always be able to write `return (x, y)`. I haven't really used | them, but linear types _are_ supported in Haskell, and you can | generalize the Monad class to be able to handle them. This | would conceptually correspond to x being some sort of limited | resource that we can 't copy arbitrarily, which is more than a | purely mathematical curio. | | In mathematics more broadly, the fact that you don't _always_ | have the equivalent of the `strength` function is useful | because it lets us work with different kinds of products than | just tuples. This can even be useful for practical work: we | might want to model something like hardware or quantum | computations which behave differently than "normal" programs. | Requiring all monads in that context to support `strength` | would really restrict the sort of things you could useful model | _as_ monads. | hackandthink wrote: | >What is different about a math monad that makes strength no | available, and why is that interesting? | | Let's turn it around. Why is strength for Haskell Monads | interesting? | | Answer: it enables a nicer do notation, you can use | intermediate values: | | https://mroman42.github.io/notes/Pieces/Do-notation-for-stro... ___________________________________________________________________ (page generated 2023-08-21 23:00 UTC)