2025/03/04

2025-03-04 00:02:16 +0100peterbecich(~Thunderbi@syn-047-229-123-186.res.spectrum.com) peterbecich
2025-03-04 00:09:37 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) merijn
2025-03-04 00:12:59 +0100peterbecich(~Thunderbi@syn-047-229-123-186.res.spectrum.com) (Ping timeout: 260 seconds)
2025-03-04 00:14:15 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 244 seconds)
2025-03-04 00:14:44 +0100alfiee(~alfiee@user/alfiee) alfiee
2025-03-04 00:17:54 +0100LainExperiments(~LainExper@user/LainExperiments) LainExperiments
2025-03-04 00:19:34 +0100alfiee(~alfiee@user/alfiee) (Ping timeout: 272 seconds)
2025-03-04 00:22:12 +0100__monty__(~toonn@user/toonn) (Quit: leaving)
2025-03-04 00:24:59 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) merijn
2025-03-04 00:28:19 +0100merijn(~merijn@host-vr.cgnat-g.v4.dfn.nl) (Read error: Connection reset by peer)
2025-03-04 00:31:36 +0100fp(~Thunderbi@hof1.kyla.fi) (Ping timeout: 272 seconds)
2025-03-04 00:35:25 +0100 <haskellbridge> <Liamzee> jackdk: I'm just doing a simple tetris game in Rust, turned out to have taken much longer until I went to datatypes -> functions (in this case methods) approach
2025-03-04 00:35:48 +0100fmira(~user@user/fmira) (Remote host closed the connection)
2025-03-04 00:36:32 +0100fmira(~user@user/fmira) fmira
2025-03-04 00:38:00 +0100 <haskellbridge> <Liamzee> i guess none of what i'm saying is new; people with orders of magnitude more experience than me have compared OOP vs FP approaches; OOP has very nice things about how it organizes code (I've always found FP libs to be disorganized)
2025-03-04 00:38:28 +0100 <haskellbridge> <Liamzee> for instance, someone told me that Haskellers just tend to define datatypes anywhere instead of using specialized modules
2025-03-04 00:39:10 +0100 <haskellbridge> <Liamzee> also, a very nice thing about playing with Rust is that it's so freaking verbose
2025-03-04 00:39:44 +0100ystael(~ystael@user/ystael) (Ping timeout: 252 seconds)
2025-03-04 00:40:04 +0100 <haskellbridge> <Liamzee> you know me as the guy (Inst) who likes to complain about minor syntax issues with Haskell, when Haskell is tied with Python for terseness (monad accounting cancels out FP terseness)
2025-03-04 00:42:24 +0100 <c_wraith> python is not what I think of when I think of a terse language.
2025-03-04 00:42:35 +0100 <c_wraith> I think of like apl or julia.
2025-03-04 00:42:52 +0100 <haskellbridge> <Liamzee> begin end
2025-03-04 00:43:38 +0100 <haskellbridge> <Liamzee> although obv apl wins ahead, and it's all classical chinese to me (modern Chinese has tons of digraphs, classical Chinese, the older you get, the more single character words) :)
2025-03-04 00:43:51 +0100 <geekosaur> you want terse? mumps
2025-03-04 00:43:55 +0100 <haskellbridge> <Liamzee> /s/wins ahead/comes out ahead/
2025-03-04 00:44:21 +0100 <haskellbridge> <Liamzee> https://en.wikipedia.org/wiki/MUMPS
2025-03-04 00:55:20 +0100ljdarj(~Thunderbi@user/ljdarj) (Ping timeout: 265 seconds)
2025-03-04 00:58:19 +0100prasad(~Thunderbi@c-73-246-138-70.hsd1.in.comcast.net)
2025-03-04 01:01:45 +0100dudek(~dudek@2a02:a312:c9df:bf80:dd97:ea4a:fd09:4598)
2025-03-04 01:01:53 +0100 <haskellbridge> <Liamzee> dumb jokes: Maybe is a comonad in the pseudo-category Hask; just error "Maybe is a comonad in the pseudo-category Hask" on Nothing.
2025-03-04 01:03:09 +0100alfiee(~alfiee@user/alfiee) alfiee
2025-03-04 01:03:40 +0100LainExperiments(~LainExper@user/LainExperiments) (Ping timeout: 240 seconds)
2025-03-04 01:05:59 +0100Sgeo(~Sgeo@user/sgeo) Sgeo
2025-03-04 01:07:36 +0100alfiee(~alfiee@user/alfiee) (Ping timeout: 252 seconds)
2025-03-04 01:11:55 +0100LainExperiments(~LainExper@user/LainExperiments) LainExperiments
2025-03-04 01:22:09 +0100Googulator93(~Googulato@2a01-036d-0106-14b2-c443-5a96-b49d-1dd5.pool6.digikabel.hu) (Quit: Client closed)
2025-03-04 01:22:21 +0100Googulator93(~Googulato@2a01-036d-0106-14b2-c443-5a96-b49d-1dd5.pool6.digikabel.hu)
2025-03-04 01:23:21 +0100Square(~Square@user/square) Square
2025-03-04 01:37:54 +0100myxos(~myxos@syn-065-028-251-121.res.spectrum.com) myxokephale
2025-03-04 01:40:59 +0100yegorc(~yegorc@user/yegorc) yegorc
2025-03-04 01:43:28 +0100acidjnk_new(~acidjnk@p200300d6e7283f05ac853a078363741e.dip0.t-ipconnect.de) (Ping timeout: 252 seconds)
2025-03-04 01:45:19 +0100sprotte24(~sprotte24@p200300d16f02be0071e2e7b150ab479e.dip0.t-ipconnect.de) (Quit: Leaving)
2025-03-04 01:49:19 +0100xff0x(~xff0x@2405:6580:b080:900:9bc7:c2e3:e40a:e335) (Ping timeout: 244 seconds)
2025-03-04 01:50:33 +0100alfiee(~alfiee@user/alfiee) alfiee
2025-03-04 01:54:51 +0100Tuplanolla(~Tuplanoll@91-159-69-59.elisa-laajakaista.fi) (Quit: Leaving.)
2025-03-04 01:55:01 +0100alfiee(~alfiee@user/alfiee) (Ping timeout: 268 seconds)
2025-03-04 01:55:35 +0100dudek(~dudek@2a02:a312:c9df:bf80:dd97:ea4a:fd09:4598) (Quit: Leaving)
2025-03-04 01:56:58 +0100 <monochrom> Up to a first-order approximation, OOP is more well-organized than FP, yes. But there is a blindspot in OOP advocacy based on that.
2025-03-04 01:58:46 +0100 <monochrom> Ever heard of mutilple dispatch? Everything is not single dispatch. Only Common Lisp Object System does justice in this regard. C++ comes close, acknowledging that for binary operators such as (+), both a.add(b) and b.add(a) are wrong, you are supposed to have "friend-of-C add(C a, C b)".
2025-03-04 01:59:07 +0100misterfish(~misterfis@84.53.85.146) (Ping timeout: 265 seconds)
2025-03-04 01:59:51 +0100 <monochrom> This means that with most OOP languages that understand only single dispatch, some of your organization is artificially biased, which means, if you think about it, poor and clumsy organization, worse than FP's free form.
2025-03-04 02:00:46 +0100Jonno_FTW(~come@user/jonno-ftw/x-0835346) (Ping timeout: 252 seconds)
2025-03-04 02:01:20 +0100 <monochrom> I forgot what OCaml does for binary operators like that, but ISTR it is at least decent.
2025-03-04 02:02:34 +0100Jonno_FTW(~come@user/jonno-ftw/x-0835346) Jonno_FTW
2025-03-04 02:05:04 +0100 <constxd> My toy language has proper multiple-dispatch for binary operators, glad to know it's only _partially_ wrong :)
2025-03-04 02:05:38 +0100 <monochrom> Well yeah you need multiple dispatch for n-ary operations for all n to claim completeness. :)
2025-03-04 02:06:10 +0100 <monochrom> But I wouldn't say "wrong" I just say "has a limit".
2025-03-04 02:07:51 +0100 <constxd> Wait actually I guess it has n-ary except only when you have like `fn f(x: A, y: B, z: C) { ... } fn f(x: D, y: E, z: F) { ... }` defined together lexically. Whereas defining a new binary operator somewhere else doesn't shadow anything, it just updates the dispatch rules for that operator
2025-03-04 02:08:17 +0100 <monochrom> Actually, I forgot Julia. It's also multiple dispatch.
2025-03-04 02:08:40 +0100 <monochrom> Although, I heard that it's very slow when you actually use that in anger.
2025-03-04 02:09:23 +0100 <monochrom> And actually it's what you said that reminds me that Julia does that too.
2025-03-04 02:12:07 +0100 <constxd> It's not clear to me how to make multiple dispatch fit into OOP nicely. Like isn't one of the main tenets that calling a method corresponds to sending a message to the object?
2025-03-04 02:12:36 +0100yegorc(~yegorc@user/yegorc) (Leaving)
2025-03-04 02:12:48 +0100 <constxd> With multiple dispatch, who receives the message? All n objects? If so, who produces the response?
2025-03-04 02:12:49 +0100 <monochrom> OK yes one version of definition of OOP says that.
2025-03-04 02:14:20 +0100machinedgod(~machinedg@d108-173-18-100.abhsia.telus.net) (Ping timeout: 252 seconds)
2025-03-04 02:14:51 +0100 <monochrom> We can always modify my statement to: single dispatch forces you eventually to make an artificial bias somewhere, and it is distracting and hurts organization.
2025-03-04 02:15:45 +0100 <constxd> Yeah
2025-03-04 02:17:00 +0100 <constxd> I think what people really like is quite literally just records, the x.foo() method call syntax and the fact that every class gets its own namespace for methods
2025-03-04 02:19:27 +0100 <constxd> You could eliminate the polymorphism entirely and have static dispatch only and I think you're still like 75% of the way to what people want from OOP.
2025-03-04 02:22:59 +0100 <constxd> Just adding the ability for bare functions (i.e. not methods) to be overloaded is a nice extra touch on its own, but I guess one thing you're missing from OOP is the ability for an object to later override that somehow. Like you have `fn combine(x: A, y: B) { ... }` and then later `class C < A` decides "I might be a subtype of A, but when you combine *me* with a B, you do it like this:"
2025-03-04 02:24:56 +0100 <constxd> I think it comes up seldom enough that most programmers are content to find ways around it, but I can see why it would seem like a limitation to purists. It's not surprising that CL has an answer lol
2025-03-04 02:30:09 +0100 <monochrom> I believe too at first that maybe multiple dispatch is seldom needed. Then a moment later I recall Sapir-Whorf. Is it because we really seldom need it, or is it because we worked around too many times so we forgot that we often needed it? Empirically, Julia supports it and has sufficient adoption to demonstrate that it is very important for quite a number of people.
2025-03-04 02:34:25 +0100bilegeek(~bilegeek@2600:1008:b05f:254e:e3e7:4564:3017:d45) bilegeek
2025-03-04 02:36:57 +0100alfiee(~alfiee@user/alfiee) alfiee
2025-03-04 02:39:14 +0100LainExperiments9(~LainExper@user/LainExperiments) LainExperiments
2025-03-04 02:39:42 +0100 <Leary> @tell hseg Since you're using vim, try *.
2025-03-04 02:39:42 +0100 <lambdabot> Consider it noted.
2025-03-04 02:41:02 +0100xff0x(~xff0x@fsb6a9491c.tkyc517.ap.nuro.jp)
2025-03-04 02:41:30 +0100alfiee(~alfiee@user/alfiee) (Ping timeout: 276 seconds)
2025-03-04 02:41:40 +0100LainExperiments(~LainExper@user/LainExperiments) (Ping timeout: 240 seconds)
2025-03-04 02:47:49 +0100 <haskellbridge> <Bowuigi> OOP is usually too entangled with imperative stuff. Any good examples of functional OOP?
2025-03-04 02:49:49 +0100DigitteknohippieDigit
2025-03-04 02:50:57 +0100mange(~user@user/mange) mange
2025-03-04 02:51:02 +0100 <geekosaur> there've been a number of examples, but if they'd been good they wouldn't have withered away
2025-03-04 02:51:31 +0100 <geekosaur> early OCaml, O'Haskell, the comonadic "object" pattern…
2025-03-04 02:51:32 +0100 <monochrom> I believe that OOP implies mutable state.
2025-03-04 02:53:10 +0100 <monochrom> I have say 5 objects that refer to a linked list object. Now I insert an element into the linked list, and I want those 5 objects to see it. How do I do that in FP?
2025-03-04 02:55:51 +0100 <monochrom> Another way to say it: How do I do the Observer pattern in FP? Unless you have something that replaces and outsmarts Observer altogether, say, FRP? :)
2025-03-04 02:57:30 +0100 <monochrom> So I think one answer is my first answer "OOP is stateful, FOOP is a self-contradiction", and another is my second answer "s/object/agent/ , now it's just FRP".
2025-03-04 03:21:31 +0100jmcantrell(~weechat@user/jmcantrell) jmcantrell
2025-03-04 03:25:01 +0100alfiee(~alfiee@user/alfiee) alfiee
2025-03-04 03:26:22 +0100Smiles(uid551636@id-551636.lymington.irccloud.com) (Quit: Connection closed for inactivity)
2025-03-04 03:29:02 +0100alfiee(~alfiee@user/alfiee) (Ping timeout: 244 seconds)
2025-03-04 03:29:15 +0100bilegeek(~bilegeek@2600:1008:b05f:254e:e3e7:4564:3017:d45) (Quit: Leaving)
2025-03-04 03:29:44 +0100prasad(~Thunderbi@c-73-246-138-70.hsd1.in.comcast.net) (Quit: prasad)
2025-03-04 03:29:58 +0100prasad(~Thunderbi@c-73-246-138-70.hsd1.in.comcast.net)
2025-03-04 03:32:49 +0100notdabs(~Owner@2600:6c40:4300:950:390a:bb72:8527:cff0) (Read error: Connection reset by peer)
2025-03-04 03:33:54 +0100fmira(~user@user/fmira) (Remote host closed the connection)
2025-03-04 03:34:16 +0100fmira(~user@user/fmira) fmira
2025-03-04 03:35:32 +0100peterbecich(~Thunderbi@syn-047-229-123-186.res.spectrum.com) peterbecich
2025-03-04 03:41:31 +0100 <haskellbridge> <Bowuigi> I see. Is the observer pattern crucial to OOP itself though? It's odd to see patterns included in definitions of paradigms
2025-03-04 03:42:23 +0100bilegeek(~bilegeek@2600:1008:b05f:254e:e3e7:4564:3017:d45) bilegeek
2025-03-04 03:44:47 +0100 <monochrom> I haven't thought about crucial. I was thinking about pushing the limit.
2025-03-04 03:49:49 +0100 <haskellbridge> <Bowuigi> I see, it's not very useful with that I guess
2025-03-04 03:50:05 +0100 <haskellbridge> <Bowuigi> Without such patterns, rather
2025-03-04 03:56:23 +0100tavare(~tavare@user/tavare) tavare
2025-03-04 04:05:37 +0100 <yin> i don't think FP and statefullness are mutually exclusive
2025-03-04 04:07:48 +0100 <yin> immutable state is very much functional
2025-03-04 04:11:22 +0100 <yin> what's the difference between having objects as observers and updating parameters in a recursive function?
2025-03-04 04:11:36 +0100stiell(~stiell@gateway/tor-sasl/stiell) (Ping timeout: 264 seconds)
2025-03-04 04:11:46 +0100alfiee(~alfiee@user/alfiee) alfiee
2025-03-04 04:16:04 +0100alfiee(~alfiee@user/alfiee) (Ping timeout: 252 seconds)
2025-03-04 04:18:16 +0100stiell(~stiell@gateway/tor-sasl/stiell) stiell
2025-03-04 04:19:19 +0100smalltalkman(uid545680@id-545680.hampstead.irccloud.com) smalltalkman
2025-03-04 04:22:21 +0100vanishingideal(~vanishing@user/vanishingideal) vanishingideal
2025-03-04 04:28:59 +0100LainExperiments9(~LainExper@user/LainExperiments) (Quit: Client closed)
2025-03-04 04:41:37 +0100peterbecich(~Thunderbi@syn-047-229-123-186.res.spectrum.com) (Ping timeout: 248 seconds)
2025-03-04 04:42:28 +0100jmcantrell(~weechat@user/jmcantrell) (Ping timeout: 252 seconds)
2025-03-04 04:43:52 +0100Square(~Square@user/square) (Remote host closed the connection)
2025-03-04 04:44:33 +0100jmcantrell(~weechat@user/jmcantrell) jmcantrell
2025-03-04 04:45:55 +0100Square(~Square@user/square) Square
2025-03-04 04:50:27 +0100vanishingideal(~vanishing@user/vanishingideal) (Ping timeout: 244 seconds)
2025-03-04 04:52:37 +0100vanishingideal(~vanishing@user/vanishingideal) vanishingideal
2025-03-04 04:53:53 +0100prasad(~Thunderbi@c-73-246-138-70.hsd1.in.comcast.net) (Read error: Connection reset by peer)
2025-03-04 04:54:08 +0100prasad(~Thunderbi@c-73-246-138-70.hsd1.in.comcast.net)
2025-03-04 04:55:26 +0100anpad(~pandeyan@user/anpad) (Quit: ZNC 1.8.2 - https://znc.in)
2025-03-04 04:58:50 +0100alfiee(~alfiee@user/alfiee) alfiee
2025-03-04 05:03:43 +0100alfiee(~alfiee@user/alfiee) (Ping timeout: 268 seconds)
2025-03-04 05:04:36 +0100anpad(~pandeyan@user/anpad) anpad
2025-03-04 05:09:10 +0100messewix(~jmc@user/messewix) (Quit: Konversation terminated!)
2025-03-04 05:11:38 +0100ensyde(~ensyde@2601:5c6:c200:6dc0::a1d8) ensyde
2025-03-04 05:18:57 +0100vanishingideal(~vanishing@user/vanishingideal) (Ping timeout: 248 seconds)
2025-03-04 05:20:47 +0100vanishingideal(~vanishing@user/vanishingideal) vanishingideal