2025-03-04 00:02:16 +0100 | peterbecich | (~Thunderbi@syn-047-229-123-186.res.spectrum.com) peterbecich |
2025-03-04 00:09:37 +0100 | merijn | (~merijn@host-vr.cgnat-g.v4.dfn.nl) merijn |
2025-03-04 00:12:59 +0100 | peterbecich | (~Thunderbi@syn-047-229-123-186.res.spectrum.com) (Ping timeout: 260 seconds) |
2025-03-04 00:14:15 +0100 | merijn | (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Ping timeout: 244 seconds) |
2025-03-04 00:14:44 +0100 | alfiee | (~alfiee@user/alfiee) alfiee |
2025-03-04 00:17:54 +0100 | LainExperiments | (~LainExper@user/LainExperiments) LainExperiments |
2025-03-04 00:19:34 +0100 | alfiee | (~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 +0100 | merijn | (~merijn@host-vr.cgnat-g.v4.dfn.nl) merijn |
2025-03-04 00:28:19 +0100 | merijn | (~merijn@host-vr.cgnat-g.v4.dfn.nl) (Read error: Connection reset by peer) |
2025-03-04 00:31:36 +0100 | fp | (~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 +0100 | fmira | (~user@user/fmira) (Remote host closed the connection) |
2025-03-04 00:36:32 +0100 | fmira | (~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 +0100 | ystael | (~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 +0100 | ljdarj | (~Thunderbi@user/ljdarj) (Ping timeout: 265 seconds) |
2025-03-04 00:58:19 +0100 | prasad | (~Thunderbi@c-73-246-138-70.hsd1.in.comcast.net) |
2025-03-04 01:01:45 +0100 | dudek | (~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 +0100 | alfiee | (~alfiee@user/alfiee) alfiee |
2025-03-04 01:03:40 +0100 | LainExperiments | (~LainExper@user/LainExperiments) (Ping timeout: 240 seconds) |
2025-03-04 01:05:59 +0100 | Sgeo | (~Sgeo@user/sgeo) Sgeo |
2025-03-04 01:07:36 +0100 | alfiee | (~alfiee@user/alfiee) (Ping timeout: 252 seconds) |
2025-03-04 01:11:55 +0100 | LainExperiments | (~LainExper@user/LainExperiments) LainExperiments |
2025-03-04 01:22:09 +0100 | Googulator93 | (~Googulato@2a01-036d-0106-14b2-c443-5a96-b49d-1dd5.pool6.digikabel.hu) (Quit: Client closed) |
2025-03-04 01:22:21 +0100 | Googulator93 | (~Googulato@2a01-036d-0106-14b2-c443-5a96-b49d-1dd5.pool6.digikabel.hu) |
2025-03-04 01:23:21 +0100 | Square | (~Square@user/square) Square |
2025-03-04 01:37:54 +0100 | myxos | (~myxos@syn-065-028-251-121.res.spectrum.com) myxokephale |
2025-03-04 01:40:59 +0100 | yegorc | (~yegorc@user/yegorc) yegorc |
2025-03-04 01:43:28 +0100 | acidjnk_new | (~acidjnk@p200300d6e7283f05ac853a078363741e.dip0.t-ipconnect.de) (Ping timeout: 252 seconds) |
2025-03-04 01:45:19 +0100 | sprotte24 | (~sprotte24@p200300d16f02be0071e2e7b150ab479e.dip0.t-ipconnect.de) (Quit: Leaving) |
2025-03-04 01:49:19 +0100 | xff0x | (~xff0x@2405:6580:b080:900:9bc7:c2e3:e40a:e335) (Ping timeout: 244 seconds) |
2025-03-04 01:50:33 +0100 | alfiee | (~alfiee@user/alfiee) alfiee |
2025-03-04 01:54:51 +0100 | Tuplanolla | (~Tuplanoll@91-159-69-59.elisa-laajakaista.fi) (Quit: Leaving.) |
2025-03-04 01:55:01 +0100 | alfiee | (~alfiee@user/alfiee) (Ping timeout: 268 seconds) |
2025-03-04 01:55:35 +0100 | dudek | (~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 +0100 | misterfish | (~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 +0100 | Jonno_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 +0100 | Jonno_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 +0100 | yegorc | (~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 +0100 | machinedgod | (~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 +0100 | bilegeek | (~bilegeek@2600:1008:b05f:254e:e3e7:4564:3017:d45) bilegeek |
2025-03-04 02:36:57 +0100 | alfiee | (~alfiee@user/alfiee) alfiee |
2025-03-04 02:39:14 +0100 | LainExperiments9 | (~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 +0100 | xff0x | (~xff0x@fsb6a9491c.tkyc517.ap.nuro.jp) |
2025-03-04 02:41:30 +0100 | alfiee | (~alfiee@user/alfiee) (Ping timeout: 276 seconds) |
2025-03-04 02:41:40 +0100 | LainExperiments | (~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 +0100 | Digitteknohippie | Digit |
2025-03-04 02:50:57 +0100 | mange | (~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 +0100 | jmcantrell | (~weechat@user/jmcantrell) jmcantrell |
2025-03-04 03:25:01 +0100 | alfiee | (~alfiee@user/alfiee) alfiee |
2025-03-04 03:26:22 +0100 | Smiles | (uid551636@id-551636.lymington.irccloud.com) (Quit: Connection closed for inactivity) |
2025-03-04 03:29:02 +0100 | alfiee | (~alfiee@user/alfiee) (Ping timeout: 244 seconds) |
2025-03-04 03:29:15 +0100 | bilegeek | (~bilegeek@2600:1008:b05f:254e:e3e7:4564:3017:d45) (Quit: Leaving) |
2025-03-04 03:29:44 +0100 | prasad | (~Thunderbi@c-73-246-138-70.hsd1.in.comcast.net) (Quit: prasad) |
2025-03-04 03:29:58 +0100 | prasad | (~Thunderbi@c-73-246-138-70.hsd1.in.comcast.net) |
2025-03-04 03:32:49 +0100 | notdabs | (~Owner@2600:6c40:4300:950:390a:bb72:8527:cff0) (Read error: Connection reset by peer) |
2025-03-04 03:33:54 +0100 | fmira | (~user@user/fmira) (Remote host closed the connection) |
2025-03-04 03:34:16 +0100 | fmira | (~user@user/fmira) fmira |
2025-03-04 03:35:32 +0100 | peterbecich | (~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 +0100 | bilegeek | (~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 +0100 | tavare | (~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 +0100 | stiell | (~stiell@gateway/tor-sasl/stiell) (Ping timeout: 264 seconds) |
2025-03-04 04:11:46 +0100 | alfiee | (~alfiee@user/alfiee) alfiee |
2025-03-04 04:16:04 +0100 | alfiee | (~alfiee@user/alfiee) (Ping timeout: 252 seconds) |
2025-03-04 04:18:16 +0100 | stiell | (~stiell@gateway/tor-sasl/stiell) stiell |
2025-03-04 04:19:19 +0100 | smalltalkman | (uid545680@id-545680.hampstead.irccloud.com) smalltalkman |
2025-03-04 04:22:21 +0100 | vanishingideal | (~vanishing@user/vanishingideal) vanishingideal |
2025-03-04 04:28:59 +0100 | LainExperiments9 | (~LainExper@user/LainExperiments) (Quit: Client closed) |
2025-03-04 04:41:37 +0100 | peterbecich | (~Thunderbi@syn-047-229-123-186.res.spectrum.com) (Ping timeout: 248 seconds) |
2025-03-04 04:42:28 +0100 | jmcantrell | (~weechat@user/jmcantrell) (Ping timeout: 252 seconds) |
2025-03-04 04:43:52 +0100 | Square | (~Square@user/square) (Remote host closed the connection) |
2025-03-04 04:44:33 +0100 | jmcantrell | (~weechat@user/jmcantrell) jmcantrell |
2025-03-04 04:45:55 +0100 | Square | (~Square@user/square) Square |
2025-03-04 04:50:27 +0100 | vanishingideal | (~vanishing@user/vanishingideal) (Ping timeout: 244 seconds) |
2025-03-04 04:52:37 +0100 | vanishingideal | (~vanishing@user/vanishingideal) vanishingideal |
2025-03-04 04:53:53 +0100 | prasad | (~Thunderbi@c-73-246-138-70.hsd1.in.comcast.net) (Read error: Connection reset by peer) |
2025-03-04 04:54:08 +0100 | prasad | (~Thunderbi@c-73-246-138-70.hsd1.in.comcast.net) |
2025-03-04 04:55:26 +0100 | anpad | (~pandeyan@user/anpad) (Quit: ZNC 1.8.2 - https://znc.in) |
2025-03-04 04:58:50 +0100 | alfiee | (~alfiee@user/alfiee) alfiee |
2025-03-04 05:03:43 +0100 | alfiee | (~alfiee@user/alfiee) (Ping timeout: 268 seconds) |
2025-03-04 05:04:36 +0100 | anpad | (~pandeyan@user/anpad) anpad |
2025-03-04 05:09:10 +0100 | messewix | (~jmc@user/messewix) (Quit: Konversation terminated!) |
2025-03-04 05:11:38 +0100 | ensyde | (~ensyde@2601:5c6:c200:6dc0::a1d8) ensyde |
2025-03-04 05:18:57 +0100 | vanishingideal | (~vanishing@user/vanishingideal) (Ping timeout: 248 seconds) |
2025-03-04 05:20:47 +0100 | vanishingideal | (~vanishing@user/vanishingideal) vanishingideal |
2025-03-04 05:23:13 +0100 | cheater | (~Username@user/cheater) (Ping timeout: 244 seconds) |
2025-03-04 05:23:49 +0100 | cheater | (~Username@user/cheater) cheater |
2025-03-04 05:35:25 +0100 | tinjamin48 | (~tinjamin@banshee.h4x0r.space) |