2022/12/15

2022-12-15 00:00:09 +0100iqubic(~avi@2601:602:9502:c70:6988:8eb0:bd8c:3233) (Remote host closed the connection)
2022-12-15 00:00:40 +0100JordiGH(~jordi@user/jordigh)
2022-12-15 00:00:53 +0100money_(~money@user/polo)
2022-12-15 00:07:21 +0100ballast(~ballast@cpe-104-32-238-223.socal.res.rr.com)
2022-12-15 00:09:04 +0100 <ballast> if i have a really simple data type (let's say it's isomorphic to `Either String Int`), is there a library i can use to easily define a parser and pretty printer for it?
2022-12-15 00:09:21 +0100freeside(~mengwong@pd907d273.dip0.t-ipconnect.de)
2022-12-15 00:09:47 +0100 <ballast> i swear i've seen things like this before (was it called bidirectional parsing? all of those libraries i found on hackage seem unpopular/unmaintained) but I can't for the life of me remember where
2022-12-15 00:10:07 +0100tomokojun_(~tomokojun@75.164.24.44)
2022-12-15 00:10:13 +0100tomokojun_(~tomokojun@75.164.24.44) (Remote host closed the connection)
2022-12-15 00:10:43 +0100elevenkb(~elevenkb@105.224.37.83) (Ping timeout: 260 seconds)
2022-12-15 00:12:19 +0100 <monochrom> data MyType = Case1 Int | Case2 String deriving Show
2022-12-15 00:12:30 +0100 <monochrom> err, deriving (Read, Show)
2022-12-15 00:12:42 +0100merijn(~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 256 seconds)
2022-12-15 00:13:56 +0100 <ballast> ah but i want to for example parse "32" as `Case1 Int` and "test" as `Case2 String` . It seems like I'll just have to settle for rolling my own simple parser
2022-12-15 00:14:11 +0100 <monochrom> I wouldn't want that.
2022-12-15 00:14:13 +0100smol-hors(sid524992@smol/hors)
2022-12-15 00:14:25 +0100 <jackdk> ballast: best trick I found is to use a profunctor that can also be a monad (so you can do monadic wrangling if you need). If the parser and printer are set up right (parser `p` is applicative/alternative and `pr` divisible/decidable, then `Product (Clown p) (Joker pr)` might work with the tools in control.arrow or product-profunctors
2022-12-15 00:14:25 +0100 <EvanR> deriving (Num) xD
2022-12-15 00:14:37 +0100 <smol-hors> how does one install Haskell these days? it's been a while since I've used it. I wanted to try Euterpea.
2022-12-15 00:14:41 +0100 <EvanR> deriving (IsString)
2022-12-15 00:14:53 +0100 <monochrom> data FunType = Case1 Int | Case2 Int. I wouldn't always want "32" to be parsed as Case1 32, and I wouldn't always want Case2 32 either.
2022-12-15 00:15:20 +0100 <jackdk> ballast: https://www.microsoft.com/en-us/research/wp-content/uploads/2004/01/picklercombinators.pdf and https://poisson.chat/esop19/composing-bidir-prog-monadically.pdf are some rough papers that might help
2022-12-15 00:15:44 +0100 <jackdk> monochrom: `data I = Even Int | Odd Int` would set certain expectations about the parse of `"32"`
2022-12-15 00:15:50 +0100 <jackdk> smol-hors: https://www.haskell.org/ghcup/
2022-12-15 00:16:13 +0100 <jackdk> ballast: sorry, got confused, the parser is in the Joker and the pretty-printer is in the Clown
2022-12-15 00:16:35 +0100 <ballast> jackdk: oh… you weren't making up names…
2022-12-15 00:16:42 +0100 <smol-hors> jackdk: thank you
2022-12-15 00:16:43 +0100 <EvanR> ballast, I'm skeptical that you're saving a huge amount of code with these javascript-like shenanigans. But Num class has magic for numeric literals and IsString has magic for string literals
2022-12-15 00:17:28 +0100 <EvanR> IsString magic enabled via OverloadedStrings in particular tends to cause other trouble IME
2022-12-15 00:18:05 +0100 <ballast> hrm, i didn't mean to raise alarm by mentioning that i wanted to parse 32 to an int and test to a string. my point only is that each of the parsers ought to be relatively simple to define
2022-12-15 00:18:46 +0100 <jackdk> ballast: https://hackage.haskell.org/package/bifunctors has the newtypes; the mnemonic is "clowns to the left of me, jokers to the right; here I am, stuck in the middle with you"
2022-12-15 00:18:57 +0100 <EvanR> it's true
2022-12-15 00:19:21 +0100 <ballast> jackdk: i hope they aren't going to cut my ear off, i've grown attached to it
2022-12-15 00:19:29 +0100 <ballast> or perhaps it's grown attached to me?
2022-12-15 00:19:43 +0100 <EvanR> pretty printing and parsing could be pretty simple
2022-12-15 00:20:34 +0100shriekingnoise(~shrieking@186.137.167.202) (Ping timeout: 272 seconds)
2022-12-15 00:20:59 +0100 <EvanR> you can even install them as your Show and Read instance
2022-12-15 00:21:10 +0100 <monochrom> "deriving (Read, Show)" is very simple to define.
2022-12-15 00:21:42 +0100 <EvanR> *assuming we're not talking about the standard derived instances for some reason, because otherwise it's trivial
2022-12-15 00:22:06 +0100 <EvanR> my XY problem detector is now going off though
2022-12-15 00:22:54 +0100 <ballast> fair enough, usually i ask a question because i suspect there is a slicker way of solving my problem
2022-12-15 00:23:04 +0100 <monochrom> Yeah please write a formal specification and sign your name under it. :)
2022-12-15 00:23:13 +0100 <ballast> of course slicker doesn't necessarily mean better
2022-12-15 00:23:45 +0100 <ballast> but at the very least i'm learning about what high-powered options i have to accomplish even simple tasks :)
2022-12-15 00:24:06 +0100cowboy8625(~cowboy@96-2-208-2-static.midco.net) (Quit: WeeChat 3.5)
2022-12-15 00:25:12 +0100michalz(~michalz@185.246.204.89) (Remote host closed the connection)
2022-12-15 00:25:58 +0100 <smol-hors> do I want 'stack exec --package euterpea -- ghci', then to try it?
2022-12-15 00:26:18 +0100ubert(~Thunderbi@p200300ecdf264ebd3096e1a4e8bd793f.dip0.t-ipconnect.de) (Ping timeout: 256 seconds)
2022-12-15 00:26:51 +0100ubert(~Thunderbi@p200300ecdf264e1ec8d72b0a2c29e966.dip0.t-ipconnect.de)
2022-12-15 00:30:14 +0100fizbin(~fizbin@user/fizbin)
2022-12-15 00:33:52 +0100 <smol-hors> ok I did that but I'm running the examples and not hearing anything RIP
2022-12-15 00:36:09 +0100Sgeo(~Sgeo@user/sgeo)
2022-12-15 00:38:45 +0100masterbuilder(~master@user/masterbuilder) (Quit: Lost terminal)
2022-12-15 00:40:57 +0100money_(~money@user/polo) (Quit: late)
2022-12-15 00:43:53 +0100 <smol-hors> nvm I found my problem in troubleshooting. sorry for bothering you all!
2022-12-15 00:44:02 +0100money_(~money@user/polo)
2022-12-15 00:47:03 +0100eggplantade(~Eggplanta@2600:1700:38c5:d800:f49d:401d:a888:f078) (Remote host closed the connection)
2022-12-15 00:51:32 +0100dimsuz(~dimsuz@10-91-52-95.baltnet.ru)
2022-12-15 00:53:50 +0100brettgilio(~brettgili@x-irc.gq) (Quit: The Lounge - https://thelounge.chat)
2022-12-15 00:54:49 +0100money_(~money@user/polo) (Quit: late)
2022-12-15 00:58:00 +0100ballast(~ballast@cpe-104-32-238-223.socal.res.rr.com) (Quit: Client closed)
2022-12-15 00:58:02 +0100money_(~money@user/polo)
2022-12-15 00:58:03 +0100 <dimsuz> Hi! I have a list [a] and then I know that some elements under certain indexes (say 1, 3, 4) I must call "f :: a" and prepend this 'a' to element at that index. so given [a,b,c,d,e] I would get [a, x, b, c, y, d, z, e]. I'm trying to think of what instrument to use here: can this be done with foldr/foldl, or can I use Traversable (which I don't
2022-12-15 00:58:04 +0100 <dimsuz> fully grasp yet).
2022-12-15 00:58:36 +0100 <dimsuz> I'd be thankful for a pointer on where I should point my reading to
2022-12-15 00:59:46 +0100 <dimsuz> I would also like this to be a performant solution
2022-12-15 01:06:41 +0100 <davean> dimsuz: It can't be a traversal because you're introducing new elements, unless you combine the traversal with a mconcat
2022-12-15 01:06:55 +0100 <davean> which gives you back the folding.
2022-12-15 01:07:12 +0100 <davean> and the traversal generally doesn't give you the index
2022-12-15 01:08:09 +0100 <EvanR> I'd write a recursive function
2022-12-15 01:08:47 +0100merijn(~merijn@86-86-29-250.fixed.kpn.net)
2022-12-15 01:13:08 +0100freeside(~mengwong@pd907d273.dip0.t-ipconnect.de) (Ping timeout: 272 seconds)
2022-12-15 01:13:38 +0100 <dsal> Yeah, that's kind of a corecursion you're describing.
2022-12-15 01:14:07 +0100 <dsal> (at least that's how I'd think of it)
2022-12-15 01:20:14 +0100acidjnk(~acidjnk@p200300d6e7137a66c0eb5a8137ed3b6d.dip0.t-ipconnect.de) (Ping timeout: 246 seconds)
2022-12-15 01:21:47 +0100 <jackdk> dimsuz: I'd probably keep it simple here, and write `concatMapWithIndex :: (Int -> a -> [b]) -> [a] -> [b]`. Or if you want to use existing functions only, zip the list with `[0..]` to get a list of (index,`a`) tuples and then `concatMap`
2022-12-15 01:23:02 +0100 <jackdk> could probably do it with `ifoldr :: FoldableWithIndex i f => (i -> a -> b -> b) -> b -> f a -> b` too (from package `indexed-traversable`)
2022-12-15 01:23:10 +0100 <EvanR> it's supposed to insert [x,y,z] at "original index" 1,3,4
2022-12-15 01:23:21 +0100 <EvanR> so the subject list keeps getting pushed back 1
2022-12-15 01:23:25 +0100Tuplanolla(~Tuplanoll@91-159-68-152.elisa-laajakaista.fi) (Quit: Leaving.)
2022-12-15 01:23:35 +0100elevenkb(~elevenkb@105.224.37.128)
2022-12-15 01:23:45 +0100 <EvanR> z ends up at 6
2022-12-15 01:24:48 +0100 <jackdk> if your indices are updating as you add elements, I would write this with direct recursion
2022-12-15 01:25:01 +0100acidjnk(~acidjnk@p200300d6e7137a66c0eb5a8137ed3b6d.dip0.t-ipconnect.de)
2022-12-15 01:25:06 +0100money_(~money@user/polo) (Quit: late)
2022-12-15 01:25:07 +0100fizbin(~fizbin@user/fizbin) (Ping timeout: 268 seconds)
2022-12-15 01:25:25 +0100eggplantade(~Eggplanta@2600:1700:38c5:d800:f49d:401d:a888:f078)
2022-12-15 01:27:18 +0100 <davean> yah, its at the orgional indexes which is why fold makes it so easy
2022-12-15 01:30:08 +0100 <dimsuz> thank you all! yeah, indices are not updating as I add elements. The concrete example is I write a gui app to display diffs, each diff is a [LineWidget] and at certain line numbers I need to insert "comments", so it would be [LineWidget, CommentWidget, LineWdiget], and function returns [Widget]
2022-12-15 01:30:50 +0100gurkenglas(~gurkengla@p548ac72e.dip0.t-ipconnect.de)
2022-12-15 01:32:41 +0100money__(~money@user/polo)
2022-12-15 01:32:42 +0100 <jackdk> then I'd probably just `concatMap` or `ifoldr`, possibly building an intermediate `[(Maybe CommentWidget, LineWidget)]` before flattening into `[Widget]`
2022-12-15 01:34:41 +0100 <dimsuz> oh, right, using `Maybe` here also occured in my head: consulting an index on weather to insert a comment here would produce a Maybe + flatten
2022-12-15 01:39:44 +0100m1dnight(~christoph@78-22-0-121.access.telenet.be) (Ping timeout: 260 seconds)
2022-12-15 01:41:25 +0100razetime(~quassel@49.207.203.213)
2022-12-15 01:41:30 +0100mvk(~mvk@2607:fea8:5ce3:8500::6126)
2022-12-15 01:41:43 +0100mvk(~mvk@2607:fea8:5ce3:8500::6126) (Client Quit)
2022-12-15 01:42:21 +0100dimsuz(~dimsuz@10-91-52-95.baltnet.ru) (Quit: Client closed)
2022-12-15 01:42:25 +0100zeenk(~zeenk@2a02:2f04:a30d:4300::7fe) (Quit: Konversation terminated!)
2022-12-15 01:43:17 +0100azimut(~azimut@gateway/tor-sasl/azimut) (Quit: ZNC - https://znc.in)
2022-12-15 01:44:30 +0100azimut(~azimut@gateway/tor-sasl/azimut)
2022-12-15 01:45:12 +0100freeside(~mengwong@pd907d273.dip0.t-ipconnect.de)
2022-12-15 01:46:35 +0100bitdex(~bitdex@gateway/tor-sasl/bitdex)
2022-12-15 01:52:16 +0100merijn(~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 252 seconds)
2022-12-15 01:54:05 +0100Maeda(~Maeda@91-161-10-149.subs.proxad.net) (Ping timeout: 260 seconds)
2022-12-15 01:58:40 +0100[itchyjunk](~itchyjunk@user/itchyjunk/x-7353470) (Ping timeout: 256 seconds)
2022-12-15 01:59:37 +0100money__(~money@user/polo) (Ping timeout: 256 seconds)
2022-12-15 01:59:53 +0100elevenkb(~elevenkb@105.224.37.128) (Quit: Client closed)
2022-12-15 02:00:14 +0100elevenkb(~elevenkb@105.224.37.128)
2022-12-15 02:00:39 +0100elevenkb(~elevenkb@105.224.37.128) (Client Quit)
2022-12-15 02:02:40 +0100[itchyjunk](~itchyjunk@user/itchyjunk/x-7353470)
2022-12-15 02:06:28 +0100merijn(~merijn@86-86-29-250.fixed.kpn.net)
2022-12-15 02:07:09 +0100Igloo(~ian@matrix.chaos.earth.li) (Ping timeout: 260 seconds)
2022-12-15 02:08:58 +0100Igloo(~ian@matrix.chaos.earth.li)
2022-12-15 02:10:28 +0100ryanbooker(uid4340@id-4340.hampstead.irccloud.com)
2022-12-15 02:10:34 +0100albet70(~xxx@2400:8902::f03c:92ff:fe60:98d8) (Remote host closed the connection)
2022-12-15 02:11:05 +0100merijn(~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 252 seconds)
2022-12-15 02:16:41 +0100albet70(~xxx@2400:8902::f03c:92ff:fe60:98d8)
2022-12-15 02:17:56 +0100acidjnk(~acidjnk@p200300d6e7137a66c0eb5a8137ed3b6d.dip0.t-ipconnect.de) (Ping timeout: 252 seconds)
2022-12-15 02:19:35 +0100waleee(~waleee@2001:9b0:213:7200:cc36:a556:b1e8:b340)
2022-12-15 02:19:59 +0100acidjnk(~acidjnk@p200300d6e7137a66c0eb5a8137ed3b6d.dip0.t-ipconnect.de)
2022-12-15 02:21:32 +0100xff0x_(~xff0x@ai071162.d.east.v6connect.net) (Ping timeout: 272 seconds)
2022-12-15 02:24:10 +0100ddellacosta(~ddellacos@143.244.47.88)
2022-12-15 02:26:51 +0100ddb(~ddb@tilde.club) (Ping timeout: 252 seconds)
2022-12-15 02:27:57 +0100ddb(~ddb@tilde.club)
2022-12-15 02:43:04 +0100motherfsck(~motherfsc@user/motherfsck) (Ping timeout: 272 seconds)
2022-12-15 02:44:06 +0100acidjnk(~acidjnk@p200300d6e7137a66c0eb5a8137ed3b6d.dip0.t-ipconnect.de) (Read error: Connection reset by peer)
2022-12-15 02:51:08 +0100waleee(~waleee@2001:9b0:213:7200:cc36:a556:b1e8:b340) (Ping timeout: 260 seconds)
2022-12-15 02:52:38 +0100wroathe(~wroathe@207-153-38-140.fttp.usinternet.com)
2022-12-15 02:52:38 +0100wroathe(~wroathe@207-153-38-140.fttp.usinternet.com) (Changing host)
2022-12-15 02:52:38 +0100wroathe(~wroathe@user/wroathe)
2022-12-15 02:55:53 +0100motherfsck(~motherfsc@user/motherfsck)
2022-12-15 02:57:02 +0100azimut(~azimut@gateway/tor-sasl/azimut) (Ping timeout: 255 seconds)
2022-12-15 03:07:30 +0100xff0x_(~xff0x@125x103x176x34.ap125.ftth.ucom.ne.jp)
2022-12-15 03:07:59 +0100merijn(~merijn@86-86-29-250.fixed.kpn.net)
2022-12-15 03:16:00 +0100wroathe(~wroathe@user/wroathe) (Ping timeout: 272 seconds)
2022-12-15 03:22:28 +0100chexum(~quassel@gateway/tor-sasl/chexum) (Remote host closed the connection)
2022-12-15 03:25:22 +0100gurkenglas(~gurkengla@p548ac72e.dip0.t-ipconnect.de) (Ping timeout: 268 seconds)
2022-12-15 03:29:55 +0100haskl(~haskl@user/haskl) (Quit: Uh oh... ZNC disconnected.)
2022-12-15 03:30:10 +0100haskl(~haskl@user/haskl)
2022-12-15 03:32:02 +0100waleee(~waleee@2001:9b0:213:7200:cc36:a556:b1e8:b340)
2022-12-15 03:40:04 +0100machinedgod(~machinedg@d198-53-218-113.abhsia.telus.net) (Ping timeout: 272 seconds)
2022-12-15 03:41:10 +0100merijn(~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 252 seconds)
2022-12-15 03:46:39 +0100TonyStone(~TonyStone@cpe-74-76-57-186.nycap.res.rr.com)
2022-12-15 03:47:02 +0100kilolympus(~kilolympu@213.144.144.24) (Ping timeout: 272 seconds)
2022-12-15 03:49:14 +0100malte(~malte@mal.tc) (Ping timeout: 252 seconds)
2022-12-15 03:52:42 +0100bilegeek(~bilegeek@2600:1008:b02f:413b:9869:adf4:4498:f6c8)
2022-12-15 03:53:04 +0100emanuel(~emanuel@2001:818:e8dd:7c00:656:e5ff:fe72:9d36)
2022-12-15 03:53:26 +0100chexum(~quassel@gateway/tor-sasl/chexum)
2022-12-15 03:53:29 +0100 <emanuel> hello. finally had to use monad transformers. yeah took me a while. Noticed React copied the whole thing btw, but poorly.
2022-12-15 03:54:08 +0100emanuel(~emanuel@2001:818:e8dd:7c00:656:e5ff:fe72:9d36) (Client Quit)
2022-12-15 03:54:38 +0100unit73e(~emanuel@2001:818:e8dd:7c00:656:e5ff:fe72:9d36)
2022-12-15 03:55:44 +0100Erutuon_(~Erutuon@user/erutuon) (Quit: WeeChat 2.8)
2022-12-15 03:56:47 +0100money_(~money@user/polo)
2022-12-15 03:57:31 +0100 <unit73e> I was trying to map with "StateT a Get" and at the same time on each step "get and put" but I don't think there's an easy way to do that. I ended up just using "count N" with "get + put + getWord8" and make a ByteString.
2022-12-15 03:58:05 +0100instantaphex(~jb@c-73-171-252-84.hsd1.fl.comcast.net)
2022-12-15 04:02:24 +0100wroathe(~wroathe@207-153-38-140.fttp.usinternet.com)
2022-12-15 04:02:24 +0100wroathe(~wroathe@207-153-38-140.fttp.usinternet.com) (Changing host)
2022-12-15 04:02:24 +0100wroathe(~wroathe@user/wroathe)
2022-12-15 04:02:29 +0100Unicorn_Princess(~Unicorn_P@user/Unicorn-Princess/x-3540542) (Quit: Leaving)
2022-12-15 04:04:54 +0100money__(~money@user/polo)
2022-12-15 04:07:41 +0100money_(~money@user/polo) (Ping timeout: 256 seconds)
2022-12-15 04:09:31 +0100johnw(~johnw@2600:1700:cf00:db0:10fb:30b:5c13:20f5) (Quit: ZNC - http://znc.in)
2022-12-15 04:15:19 +0100money_(~money@user/polo)
2022-12-15 04:15:19 +0100jao(~jao@cpc103048-sgyl39-2-0-cust502.18-2.cable.virginm.net) (Ping timeout: 268 seconds)
2022-12-15 04:16:11 +0100money__(~money@user/polo) (Ping timeout: 256 seconds)
2022-12-15 04:16:42 +0100kilolympus(~kilolympu@213.144.144.24)
2022-12-15 04:17:45 +0100Guest23(~Guest23@27.57.46.219)
2022-12-15 04:22:10 +0100malte(~malte@mal.tc)
2022-12-15 04:22:58 +0100money_(~money@user/polo) (Remote host closed the connection)
2022-12-15 04:23:46 +0100bontaq(~user@ool-45779fe5.dyn.optonline.net) (Ping timeout: 272 seconds)
2022-12-15 04:24:34 +0100wroathe(~wroathe@user/wroathe) (Ping timeout: 268 seconds)
2022-12-15 04:25:34 +0100FinnElija(~finn_elij@user/finn-elija/x-0085643) (Killed (NickServ (Forcing logout FinnElija -> finn_elija)))
2022-12-15 04:25:34 +0100finn_elija(~finn_elij@user/finn-elija/x-0085643)
2022-12-15 04:25:34 +0100finn_elijaFinnElija
2022-12-15 04:29:08 +0100wroathe(~wroathe@207-153-38-140.fttp.usinternet.com)
2022-12-15 04:29:08 +0100wroathe(~wroathe@207-153-38-140.fttp.usinternet.com) (Changing host)
2022-12-15 04:29:08 +0100wroathe(~wroathe@user/wroathe)
2022-12-15 04:36:54 +0100td_(~td@83.135.9.16) (Ping timeout: 268 seconds)
2022-12-15 04:37:48 +0100merijn(~merijn@86-86-29-250.fixed.kpn.net)
2022-12-15 04:38:28 +0100td_(~td@83.135.9.20)
2022-12-15 04:42:05 +0100 <EvanR> unit73e, whenever you want to use the base monad within a StateT you can use lift
2022-12-15 04:42:08 +0100 <EvanR> :t lift
2022-12-15 04:42:09 +0100 <lambdabot> (MonadTrans t, Monad m) => m a -> t m a
2022-12-15 04:45:02 +0100 <unit73e> EvanR, the idea was to first "readBytes N", then for each byte "get + put + changeByte", but instead I ended up reading each byte with "get + put + readByte" and use "count N" to get what I want
2022-12-15 04:45:06 +0100 <unit73e> probably not very efficient
2022-12-15 04:45:08 +0100 <unit73e> but it does work
2022-12-15 04:45:20 +0100wroathe(~wroathe@user/wroathe) (Ping timeout: 252 seconds)
2022-12-15 04:45:43 +0100 <unit73e> hopefully the Get monad is efficient when I do that
2022-12-15 04:46:12 +0100 <unit73e> but yes doing what I want with m and then lift would be the way to go, thanks
2022-12-15 04:46:43 +0100bottombear(~a@2605:6400:20:d66:5555:5555:5555:5555)
2022-12-15 04:47:11 +0100bottombear(~a@2605:6400:20:d66:5555:5555:5555:5555) ()
2022-12-15 04:47:27 +0100 <unit73e> I think I could workaround with just a simple bytestring and then lift, but eh... whatever
2022-12-15 04:48:38 +0100ddellacosta(~ddellacos@143.244.47.88) (Ping timeout: 252 seconds)
2022-12-15 04:49:40 +0100 <unit73e> on another topic, can't monad be explained as just being scope or context of what you're doing, instead of that box nonsense?
2022-12-15 04:50:00 +0100 <unit73e> because that's basically what it is, you're working on the scope of the monad
2022-12-15 04:50:22 +0100 <EvanR> box nonsense does sound like nonsense
2022-12-15 04:51:00 +0100 <unit73e> yeah I see a lot of people trying to explain Maybe as a box and you can only access indirectly
2022-12-15 04:51:01 +0100 <EvanR> dunno if just scope or just context is automatically better though
2022-12-15 04:51:22 +0100 <unit73e> in the end you do have to just read what the functions of Monad to
2022-12-15 04:51:27 +0100 <unit73e> do*
2022-12-15 04:51:39 +0100 <EvanR> well explaining the implementation of Maybe as a box or boxed value actually sounds somewhat sane
2022-12-15 04:51:50 +0100 <unit73e> except only really works for Maybe lol
2022-12-15 04:51:55 +0100 <EvanR> yeah
2022-12-15 04:52:04 +0100 <EvanR> not really monads
2022-12-15 04:54:18 +0100 <EvanR> by doing Functor first a lot of conceptual mixups would be avoided early
2022-12-15 04:55:17 +0100 <EvanR> that's enough of hurdle that no one does it xD. But if they do, then you can do Applicative and clear up even more confusion
2022-12-15 04:56:06 +0100 <unit73e> that's true, Applicative is simpler to understand than do blocks imo, because do looks like magic and Applicative is more explicit
2022-12-15 04:56:12 +0100[itchyjunk](~itchyjunk@user/itchyjunk/x-7353470) (Remote host closed the connection)
2022-12-15 04:56:57 +0100 <unit73e> to me manuals have to much text and should start straight with monads, because even hello world has IO (), but that's just me
2022-12-15 04:57:03 +0100 <unit73e> at least give a general understanding
2022-12-15 04:57:08 +0100Guest75(Guest75@2a01:7e01::f03c:92ff:fe5d:7b18) (Ping timeout: 260 seconds)
2022-12-15 04:57:15 +0100 <EvanR> you don't even need to understand monads to use IO or explain it
2022-12-15 04:58:05 +0100 <unit73e> I guess but when you want to do something more complicated it gets tricky. maybe I'll make my own crappy manual one day and everything will say it's another crap manual :p
2022-12-15 04:58:15 +0100 <unit73e> everyone*
2022-12-15 04:58:16 +0100 <EvanR> print "hello world" doesn't even use monad support (or applicative)
2022-12-15 04:59:10 +0100 <EvanR> call it Yet Another Monad Tutorial... no that's been done
2022-12-15 04:59:41 +0100 <unit73e> heh loads of them
2022-12-15 05:01:41 +0100Guest23(~Guest23@27.57.46.219) (Ping timeout: 265 seconds)
2022-12-15 05:06:36 +0100mncheck(~mncheck@193.224.205.254) (Ping timeout: 252 seconds)
2022-12-15 05:06:53 +0100 <EvanR> for IO, you can just say it's an abstract type for I/O actions. do notation translates to >>= whose type is IO a -> (a -> IO b) -> IO b
2022-12-15 05:07:01 +0100JordiGH(~jordi@user/jordigh) (Ping timeout: 252 seconds)
2022-12-15 05:07:12 +0100 <EvanR> so you can link together the likes of getLine and putStrLn
2022-12-15 05:07:35 +0100 <EvanR> which already exist. This is how most languages work, seems familiar
2022-12-15 05:08:20 +0100 <EvanR> fitting the Monad interface is a happy accident
2022-12-15 05:12:20 +0100fizbin(~fizbin@user/fizbin)
2022-12-15 05:12:32 +0100merijn(~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 272 seconds)
2022-12-15 05:16:39 +0100iqubic(~avi@2601:601:1100:edd0:9ce:db2c:6ec0:6fd1)
2022-12-15 05:21:16 +0100troydm(~troydm@host-176-37-124-197.b025.la.net.ua) (Ping timeout: 252 seconds)
2022-12-15 05:23:09 +0100motherfsck(~motherfsc@user/motherfsck) (Ping timeout: 268 seconds)
2022-12-15 05:27:30 +0100fizbin(~fizbin@user/fizbin) (Ping timeout: 252 seconds)
2022-12-15 05:27:50 +0100bilegeek(~bilegeek@2600:1008:b02f:413b:9869:adf4:4498:f6c8) (Quit: Leaving)
2022-12-15 05:32:45 +0100JordiGH(~jordi@user/jordigh)
2022-12-15 05:34:03 +0100mbuf(~Shakthi@49.204.116.170)
2022-12-15 05:36:31 +0100motherfsck(~motherfsc@user/motherfsck)
2022-12-15 05:36:39 +0100 <monochrom> Except that people love that picture tutorial in which Functor is also box nonsense.
2022-12-15 05:40:05 +0100JordiGH(~jordi@user/jordigh) (Ping timeout: 252 seconds)
2022-12-15 05:40:32 +0100fizbin(~fizbin@user/fizbin)
2022-12-15 05:40:50 +0100freeside(~mengwong@pd907d273.dip0.t-ipconnect.de) (Ping timeout: 265 seconds)
2022-12-15 05:43:52 +0100Vajb(~Vajb@2001:999:250:c9:8588:6e93:7809:7816) (Read error: Connection reset by peer)
2022-12-15 05:44:40 +0100Vajb(~Vajb@hag-jnsbng11-58c3a5-27.dhcp.inet.fi)
2022-12-15 05:46:42 +0100money_(~money@user/polo)
2022-12-15 05:48:21 +0100Vajb(~Vajb@hag-jnsbng11-58c3a5-27.dhcp.inet.fi) (Read error: Connection reset by peer)
2022-12-15 05:48:39 +0100Vajb(~Vajb@2001:999:250:c9:8588:6e93:7809:7816)
2022-12-15 05:50:56 +0100money_(~money@user/polo) (Client Quit)
2022-12-15 05:51:46 +0100waleee(~waleee@2001:9b0:213:7200:cc36:a556:b1e8:b340) (Remote host closed the connection)
2022-12-15 05:51:51 +0100Lycurgus(~juan@user/Lycurgus)
2022-12-15 05:51:56 +0100 <jackdk> I remember in chemistry class, we were explicitly taught several models of the atom, each less wrong than the last. I don't see what's wrong with doing the same for e.g., Functor, if the learner cannot reach the concept in a single step.
2022-12-15 05:52:20 +0100waleee(~waleee@2001:9b0:213:7200:cc36:a556:b1e8:b340)
2022-12-15 05:52:31 +0100 <jackdk> Allowing people to sit on incomplete or incorrect metaphors, or calling it "Mappable" and stopping people from following the thread further seem like bad things though.
2022-12-15 05:53:06 +0100 <Lycurgus> a problem compounded by the variety of actual senses in use historical and current
2022-12-15 05:53:16 +0100Techcable(~Techcable@user/Techcable) (Ping timeout: 256 seconds)
2022-12-15 05:53:31 +0100 <Lycurgus> less problematic if confined to hs
2022-12-15 05:53:45 +0100 <Lycurgus> explicitly
2022-12-15 05:54:32 +0100 <int-e> https://en.wikipedia.org/wiki/Lie-to-children
2022-12-15 05:54:42 +0100 <Lycurgus> carnap's e.g. has little relation to hs's
2022-12-15 05:55:58 +0100 <int-e> jackdk: You're not wrong. But since the given name is relevant to Haskell, you shouldn't withhold it. I think it's perfectly fine to say that in an alternative universe the class could be called "Mappable", indicating types that support a "map"-like function.
2022-12-15 05:56:11 +0100Guest23(~Guest23@27.57.46.219)
2022-12-15 05:56:19 +0100Techcable(~Techcable@user/Techcable)
2022-12-15 05:56:25 +0100 <int-e> The same thing goes for calling Monad that and not a warm and fuzzy thing.
2022-12-15 05:57:08 +0100 <int-e> (And I know it was a joke, but "warm and fuzzy thing" is actually worse because it explains nothing about what the concept is about.)
2022-12-15 05:57:23 +0100 <int-e> I guess it could be a re-heated moldy burrito though.
2022-12-15 05:57:44 +0100 <jackdk> I had to read Burritos for the Hungry Mathematician before I understood how they worked.
2022-12-15 05:58:08 +0100 <Lycurgus> my biggest pet peeve on ugly false concepts right now: the supernatural
2022-12-15 05:58:31 +0100 <int-e> Monads are notoriously difficult to explain because there's so little they abstract from, and the abstraction in itself isn't actually useful... each monad comes with associated operations that do the real work.
2022-12-15 05:58:44 +0100 <int-e> The instances are more important than the abstraction.
2022-12-15 05:59:27 +0100 <Lycurgus> the original sin of choosing a fraught philosophical term
2022-12-15 05:59:31 +0100 <int-e> "You could have invented monads" really isn't a lie.
2022-12-15 05:59:46 +0100waleee(~waleee@2001:9b0:213:7200:cc36:a556:b1e8:b340) (Ping timeout: 252 seconds)
2022-12-15 06:01:25 +0100 <Lycurgus> had the hs ppl responsible been artful dodgers, they woulda let that term be attached from the outside to refer to it
2022-12-15 06:01:28 +0100money_(~money@user/polo)
2022-12-15 06:03:39 +0100whatsupdoc(uid509081@id-509081.hampstead.irccloud.com) (Quit: Connection closed for inactivity)
2022-12-15 06:05:46 +0100 <Lycurgus> shoulda called it a brooks; 'a brooks is called in some other programming langs a "monad"' and is defined by these simple properties, easy peasey
2022-12-15 06:08:35 +0100merijn(~merijn@86-86-29-250.fixed.kpn.net)
2022-12-15 06:12:17 +0100Lycurgus(~juan@user/Lycurgus) (Quit: Exeunt: personae.ai-integration.biz)
2022-12-15 06:14:00 +0100money_(~money@user/polo) (Quit: late)
2022-12-15 06:15:54 +0100motherfsck(~motherfsc@user/motherfsck) (Ping timeout: 252 seconds)
2022-12-15 06:17:07 +0100whatsupdoc(uid509081@id-509081.hampstead.irccloud.com)
2022-12-15 06:20:13 +0100money_(~money@user/polo)
2022-12-15 06:22:56 +0100Adran(~adran@botters/adran) (Quit: Este é o fim.)
2022-12-15 06:23:11 +0100troydm(~troydm@host-176-37-124-197.b025.la.net.ua)
2022-12-15 06:26:56 +0100Adran(~adran@botters/adran)
2022-12-15 06:34:01 +0100zmt00(~zmt00@user/zmt00) (Read error: Connection reset by peer)
2022-12-15 06:36:11 +0100razetime(~quassel@49.207.203.213) (Read error: Connection reset by peer)
2022-12-15 06:36:32 +0100razetime(~quassel@49.207.203.213)
2022-12-15 06:37:10 +0100Guest23(~Guest23@27.57.46.219) (Ping timeout: 252 seconds)
2022-12-15 06:37:40 +0100money_(~money@user/polo) (Read error: Connection reset by peer)
2022-12-15 06:37:50 +0100money__(~money@user/polo)
2022-12-15 06:39:09 +0100takuan(~takuan@178-116-218-225.access.telenet.be)
2022-12-15 06:42:21 +0100azimut(~azimut@gateway/tor-sasl/azimut)
2022-12-15 06:43:19 +0100merijn(~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 268 seconds)
2022-12-15 06:45:57 +0100Guest23(~Guest23@27.57.46.219)
2022-12-15 06:46:59 +0100money__(~money@user/polo) (Quit: late)
2022-12-15 06:50:04 +0100zmt00(~zmt00@user/zmt00)
2022-12-15 06:52:34 +0100instantaphex(~jb@c-73-171-252-84.hsd1.fl.comcast.net) (Ping timeout: 268 seconds)
2022-12-15 06:54:14 +0100money_(~money@user/polo)
2022-12-15 06:59:51 +0100unit73e(~emanuel@2001:818:e8dd:7c00:656:e5ff:fe72:9d36) (Ping timeout: 260 seconds)
2022-12-15 07:00:04 +0100money__(~money@user/polo)
2022-12-15 07:02:47 +0100money_(~money@user/polo) (Ping timeout: 256 seconds)
2022-12-15 07:04:49 +0100Adran(~adran@botters/adran) (Quit: Este é o fim.)
2022-12-15 07:08:27 +0100money__(~money@user/polo) (Ping timeout: 256 seconds)
2022-12-15 07:09:06 +0100 <Jade[m]> ```hs
2022-12-15 07:09:06 +0100 <Jade[m]> foo g apply = uncurry apply . swap . fmap g
2022-12-15 07:09:06 +0100 <Jade[m]> ```
2022-12-15 07:09:06 +0100 <Jade[m]> how can you make this pointfree?
2022-12-15 07:09:31 +0100Adran(~adran@botters/adran)
2022-12-15 07:09:54 +0100bgs(~bgs@212-85-160-171.dynamic.telemach.net)
2022-12-15 07:10:13 +0100ryanbooker(uid4340@id-4340.hampstead.irccloud.com) (Quit: Connection closed for inactivity)
2022-12-15 07:10:20 +0100fizbin(~fizbin@user/fizbin) (Ping timeout: 272 seconds)
2022-12-15 07:11:01 +0100 <Jade[m]> * ```hs
2022-12-15 07:11:01 +0100 <Jade[m]> foo g apply = uncurry apply . fmap g . swap
2022-12-15 07:11:01 +0100 <Jade[m]> ```
2022-12-15 07:11:01 +0100 <Jade[m]> how can you make this pointfree?
2022-12-15 07:12:13 +0100amano(~amano@45.8.223.209)
2022-12-15 07:12:42 +0100 <int-e> @pl foo g apply = uncurry apply . fmap g . swap
2022-12-15 07:12:42 +0100 <lambdabot> foo = flip ((.) . uncurry) . (. swap) . fmap
2022-12-15 07:13:45 +0100 <amano> Has anyone used beam or any other SQL library?
2022-12-15 07:16:45 +0100kenran(~user@user/kenran)
2022-12-15 07:17:16 +0100 <Jade[m]> lambdabot: beautiful
2022-12-15 07:17:21 +0100 <Jade[m]> (no)
2022-12-15 07:17:50 +0100kenran(~user@user/kenran) (Remote host closed the connection)
2022-12-15 07:20:36 +0100 <int-e> Secretly the point of @pl is to convince people that point-free code isn't worth it :P
2022-12-15 07:24:06 +0100 <Jade[m]> haha
2022-12-15 07:24:17 +0100 <Jade[m]> I use it to find idioms more or less
2022-12-15 07:24:37 +0100 <Jade[m]> but as soon as something like . (. f) pops up im out of there
2022-12-15 07:29:59 +0100 <jackdk> @botsnack
2022-12-15 07:29:59 +0100 <lambdabot> :)
2022-12-15 07:30:55 +0100 <int-e> Jade[m]: yeah, you can recognize most point-free code by its abundance of dots
2022-12-15 07:31:26 +0100amano(~amano@45.8.223.209) ()
2022-12-15 07:35:02 +0100troydm(~troydm@host-176-37-124-197.b025.la.net.ua) (Ping timeout: 272 seconds)
2022-12-15 07:37:06 +0100trev(~trev@user/trev)
2022-12-15 07:38:19 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
2022-12-15 07:38:53 +0100merijn(~merijn@86-86-29-250.fixed.kpn.net)
2022-12-15 07:39:13 +0100motherfsck(~motherfsc@user/motherfsck)
2022-12-15 07:41:26 +0100azimut(~azimut@gateway/tor-sasl/azimut) (Ping timeout: 255 seconds)
2022-12-15 07:43:32 +0100merijn(~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 246 seconds)
2022-12-15 07:50:42 +0100azimut(~azimut@gateway/tor-sasl/azimut)
2022-12-15 07:51:44 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
2022-12-15 07:54:34 +0100azimut(~azimut@gateway/tor-sasl/azimut) (Remote host closed the connection)
2022-12-15 07:54:50 +0100bgs(~bgs@212-85-160-171.dynamic.telemach.net) (Remote host closed the connection)
2022-12-15 07:54:55 +0100azimut(~azimut@gateway/tor-sasl/azimut)
2022-12-15 07:57:25 +0100 <EvanR> but wait, you can compress a bunch of dots into .: or .:: sometimes
2022-12-15 07:57:40 +0100 <EvanR> @pl is holding out on us
2022-12-15 07:57:52 +0100money_(~money@user/polo)
2022-12-15 07:58:07 +0100michalz(~michalz@185.246.204.93)
2022-12-15 08:06:12 +0100thyriaen(~thyriaen@2a01:aea0:dd4:4bae:6245:cbff:fe9f:48b1)
2022-12-15 08:08:15 +0100azimut(~azimut@gateway/tor-sasl/azimut) (Remote host closed the connection)
2022-12-15 08:08:47 +0100azimut(~azimut@gateway/tor-sasl/azimut)
2022-12-15 08:10:31 +0100bgs(~bgs@212-85-160-171.dynamic.telemach.net)
2022-12-15 08:11:49 +0100johnw(~johnw@2600:1700:cf00:db0:b0f5:26ad:fa0:865f)
2022-12-15 08:18:33 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
2022-12-15 08:20:51 +0100bgs(~bgs@212-85-160-171.dynamic.telemach.net) (Remote host closed the connection)
2022-12-15 08:21:11 +0100money_(~money@user/polo) (Quit: late)
2022-12-15 08:29:46 +0100thegeekinside(~thegeekin@189.217.82.244) (Read error: Connection reset by peer)
2022-12-15 08:31:34 +0100motherfsck(~motherfsc@user/motherfsck) (Ping timeout: 252 seconds)
2022-12-15 08:40:56 +0100merijn(~merijn@86-86-29-250.fixed.kpn.net)
2022-12-15 08:51:35 +0100troydm(~troydm@host-176-37-124-197.b025.la.net.ua)
2022-12-15 08:55:28 +0100tabaqui(~root@88.231.62.215)
2022-12-15 08:55:37 +0100kilolympus(~kilolympu@213.144.144.24) (Read error: Connection reset by peer)
2022-12-15 08:56:54 +0100hsw(~hsw@112-104-142-182.adsl.dynamic.seed.net.tw) (Quit: Leaving)
2022-12-15 08:57:07 +0100hsw(~hsw@2001-b030-2303-0104-0172-0025-0012-0123.hinet-ip6.hinet.net)
2022-12-15 08:57:14 +0100dtman34(~dtman34@76.156.89.180) (Ping timeout: 260 seconds)
2022-12-15 08:59:21 +0100kilolympus(~kilolympu@213.144.144.24)
2022-12-15 08:59:41 +0100dtman34(~dtman34@2601:447:d000:93c9:f2ce:ff11:8e35:42b2)
2022-12-15 09:00:03 +0100dsrt^(~dsrt@76.145.185.103) (Remote host closed the connection)
2022-12-15 09:03:20 +0100azimut(~azimut@gateway/tor-sasl/azimut) (Ping timeout: 255 seconds)
2022-12-15 09:04:10 +0100 <dminuoso> mniip: Perhaps unpopular, but if you have optics or lens, you can use `preview traverse`
2022-12-15 09:04:33 +0100 <dminuoso> Ah hold on, strike that thought.
2022-12-15 09:11:18 +0100Guest23(~Guest23@27.57.46.219) (Ping timeout: 272 seconds)
2022-12-15 09:11:57 +0100use-value(~Thunderbi@2a00:23c6:8a03:2f01:39df:b639:fbf4:175b)
2022-12-15 09:12:21 +0100chexum_(~quassel@gateway/tor-sasl/chexum)
2022-12-15 09:12:47 +0100FinnElija(~finn_elij@user/finn-elija/x-0085643) (Ping timeout: 255 seconds)
2022-12-15 09:13:00 +0100merijn(~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 252 seconds)
2022-12-15 09:13:38 +0100chexum(~quassel@gateway/tor-sasl/chexum) (Quit: No Ping reply in 180 seconds.)
2022-12-15 09:15:04 +0100FinnElija(~finn_elij@user/finn-elija/x-0085643)
2022-12-15 09:16:03 +0100freeside(~mengwong@nat-veranstaltungen.uni-saarland.de)
2022-12-15 09:19:44 +0100lortabac(~lortabac@2a01:e0a:541:b8f0:5ea7:443c:a1ac:4e5c)
2022-12-15 09:22:28 +0100money_(~money@user/polo)
2022-12-15 09:22:33 +0100moneyGuest9248
2022-12-15 09:22:33 +0100money_money
2022-12-15 09:29:29 +0100money(~money@user/polo) (Quit: late)
2022-12-15 09:30:25 +0100money(~money@user/polo)
2022-12-15 09:32:13 +0100gmg(~user@user/gehmehgeh)
2022-12-15 09:33:43 +0100mncheck(~mncheck@193.224.205.254)
2022-12-15 09:42:36 +0100m1dnight(~christoph@78-22-0-121.access.telenet.be)
2022-12-15 09:46:01 +0100zeenk(~zeenk@2a02:2f04:a30d:4300::7fe)
2022-12-15 09:50:46 +0100ec(~ec@gateway/tor-sasl/ec) (Remote host closed the connection)
2022-12-15 09:50:48 +0100Maeda(~Maeda@91-161-10-149.subs.proxad.net)
2022-12-15 09:51:20 +0100Sgeo(~Sgeo@user/sgeo) (Read error: Connection reset by peer)
2022-12-15 09:51:21 +0100ec(~ec@gateway/tor-sasl/ec)
2022-12-15 09:52:01 +0100machinedgod(~machinedg@d198-53-218-113.abhsia.telus.net)
2022-12-15 09:54:29 +0100money(~money@user/polo) (Ping timeout: 256 seconds)
2022-12-15 09:54:42 +0100avicenzi(~avicenzi@2a00:ca8:a1f:b004::c32)
2022-12-15 09:58:06 +0100machinedgod(~machinedg@d198-53-218-113.abhsia.telus.net) (Ping timeout: 252 seconds)
2022-12-15 09:59:54 +0100fserucas(~fserucas@2001:818:e376:a400:fb92:70c1:dd88:c7d7)
2022-12-15 10:00:03 +0100sektor[m](~sektor@2001:470:69fc:105::2:3f60) (Quit: You have been kicked for being idle)
2022-12-15 10:00:08 +0100machinedgod(~machinedg@d198-53-218-113.abhsia.telus.net)
2022-12-15 10:05:16 +0100tomokojun(~tomokojun@75.164.24.44) (Quit: じゃあね〜。)
2022-12-15 10:08:25 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
2022-12-15 10:13:29 +0100merijn(~merijn@195.114.232.74)
2022-12-15 10:17:19 +0100mbuf(~Shakthi@49.204.116.170) (Read error: Connection reset by peer)
2022-12-15 10:17:29 +0100mbuf(~Shakthi@49.204.116.170)
2022-12-15 10:17:50 +0100vpan(~0@212.117.1.172)
2022-12-15 10:19:17 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
2022-12-15 10:19:41 +0100chele(~chele@user/chele)
2022-12-15 10:22:08 +0100eggplantade(~Eggplanta@2600:1700:38c5:d800:f49d:401d:a888:f078) (Remote host closed the connection)
2022-12-15 10:27:05 +0100tzh(~tzh@c-24-21-73-154.hsd1.wa.comcast.net) (Quit: zzz)
2022-12-15 10:27:18 +0100zer0bitz(~zer0bitz@196.244.192.57)
2022-12-15 10:27:48 +0100Xeroine(~Xeroine@user/xeroine) (Ping timeout: 252 seconds)
2022-12-15 10:30:32 +0100jakalx(~jakalx@base.jakalx.net) ()
2022-12-15 10:30:45 +0100gmg(~user@user/gehmehgeh) (Quit: Leaving)
2022-12-15 10:31:34 +0100Xeroine(~Xeroine@user/xeroine)
2022-12-15 10:31:56 +0100Guest9248money
2022-12-15 10:33:23 +0100azimut(~azimut@gateway/tor-sasl/azimut)
2022-12-15 10:36:17 +0100perrierjouet(~perrier-j@modemcable048.127-56-74.mc.videotron.ca) (Quit: WeeChat 3.7.1)
2022-12-15 10:37:56 +0100perrierjouet(~perrier-j@modemcable048.127-56-74.mc.videotron.ca)
2022-12-15 10:41:09 +0100 <probie> Do people have strong opinions about the generic-sop style of generics?
2022-12-15 10:47:16 +0100ft(~ft@p4fc2a257.dip0.t-ipconnect.de) (Quit: leaving)
2022-12-15 10:48:15 +0100ph88(~ph88@2a02:8109:9e00:71d0:1467:6d51:6255:a37) (Quit: Leaving)
2022-12-15 10:49:37 +0100coot(~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba)
2022-12-15 10:50:28 +0100 <dminuoso> I do.
2022-12-15 10:50:41 +0100kilolympus(~kilolympu@213.144.144.24) (Read error: Connection reset by peer)
2022-12-15 10:50:48 +0100jakalx(~jakalx@base.jakalx.net)
2022-12-15 10:51:30 +0100 <dminuoso> Generic code drives up compilation times and can produce very inefficient code. And the way of writing it is very uncomfortable and harsh to debug.
2022-12-15 10:51:40 +0100 <dminuoso> So by subsumption, I dislike generic-sop
2022-12-15 10:52:08 +0100 <dminuoso> Lens, aeson, mechanically derived pretty printing, TH is just far more potent for it.
2022-12-15 10:52:30 +0100 <dminuoso> And ontop, having a Generic instance essentially exposes the entire internals of your data type as public API
2022-12-15 10:52:38 +0100 <dminuoso> You cannot hide it
2022-12-15 10:54:20 +0100kilolympus(~kilolympu@213.144.144.24)
2022-12-15 10:57:22 +0100freeside(~mengwong@nat-veranstaltungen.uni-saarland.de) (Ping timeout: 252 seconds)
2022-12-15 10:57:34 +0100feliix42_(~felix@gibbs.uberspace.de)
2022-12-15 10:57:45 +0100Ram-Z_(Ram-Z@2a01:7e01::f03c:91ff:fe57:d2df)
2022-12-15 10:57:59 +0100feliix42(~felix@gibbs.uberspace.de) (Ping timeout: 255 seconds)
2022-12-15 10:58:27 +0100Ram-Z(Ram-Z@2a01:7e01::f03c:91ff:fe57:d2df) (Ping timeout: 255 seconds)
2022-12-15 10:58:36 +0100 <lortabac> I think the idea of structural polymorphism is better than metaprogramming for many tasks
2022-12-15 10:59:25 +0100 <lortabac> however the way it is implemented in GHC leads to the problems you mentioned
2022-12-15 11:00:11 +0100 <lortabac> IMHO it's a feature that should be built into the language, instead of relying on other mechanisms such as type classes
2022-12-15 11:02:35 +0100 <dminuoso> You mean like lisp?
2022-12-15 11:02:51 +0100L29Ah(~L29Ah@wikipedia/L29Ah) (Ping timeout: 248 seconds)
2022-12-15 11:04:08 +0100`2jt(~jtomas@84.red-88-17-186.dynamicip.rima-tde.net)
2022-12-15 11:04:33 +0100 <lortabac> AFAIK Common Lisp has full metaprogramming power, it's more like TH, isn't it?
2022-12-15 11:04:52 +0100 <probie> It's more than TH since you can define reader macros
2022-12-15 11:05:08 +0100 <dminuoso> It's also less than TH because there's no clear boundary. You can quote and unquote anywhere
2022-12-15 11:05:24 +0100 <dminuoso> GHC TH is this strange at-parse-time only thing with stage restrictions
2022-12-15 11:06:00 +0100 <dminuoso> In Lisp it really feels like part of the language. TH is clearly a compiler feature
2022-12-15 11:06:06 +0100 <lortabac> I was thinking of something similar to GHC's Generic but built-in
2022-12-15 11:06:20 +0100freeside(~mengwong@nat-veranstaltungen.uni-saarland.de)
2022-12-15 11:06:27 +0100 <dminuoso> Well Im just saying, in case of lisp it *is* builtin because all structure there is is lists.
2022-12-15 11:06:40 +0100 <dminuoso> TH focuses on some the AST representation rather
2022-12-15 11:07:12 +0100xff0x_(~xff0x@125x103x176x34.ap125.ftth.ucom.ne.jp) (Ping timeout: 272 seconds)
2022-12-15 11:07:31 +0100 <dminuoso> How would that differ from TH though, lortabac?
2022-12-15 11:08:45 +0100 <lortabac> it has nothing to do with TH, it's more like dependently-typed functions that can pattern-match on terms of type Type
2022-12-15 11:09:19 +0100 <dminuoso> Mmm
2022-12-15 11:09:37 +0100 <lortabac> and have some special syntax to access the metadata (field names etc.)
2022-12-15 11:10:26 +0100 <probie> The problem with TH is that it doesn't work in all environments
2022-12-15 11:12:16 +0100mbuf(~Shakthi@49.204.116.170) (Ping timeout: 272 seconds)
2022-12-15 11:12:21 +0100alphabeta(~kilolympu@213.144.144.24)
2022-12-15 11:12:41 +0100kilolympus(~kilolympu@213.144.144.24) (Ping timeout: 256 seconds)
2022-12-15 11:13:16 +0100MajorBiscuit(~MajorBisc@145.94.137.174)
2022-12-15 11:13:23 +0100ec(~ec@gateway/tor-sasl/ec) (Ping timeout: 255 seconds)
2022-12-15 11:13:40 +0100mbuf(~Shakthi@49.204.116.170)
2022-12-15 11:14:15 +0100 <albet70> there is a corner case in case … of, I hope there is a more elegant way https://paste.tomsmeding.com/D1Pedbmi
2022-12-15 11:14:43 +0100alphabeta(~kilolympu@213.144.144.24) (Read error: Connection reset by peer)
2022-12-15 11:15:16 +0100 <albet70> if there is an action is called in every case but the last, how to make it more simple?
2022-12-15 11:15:23 +0100paulpaul1076(~textual@95-29-5-111.broadband.corbina.ru) (Quit: Textual IRC Client: www.textualapp.com)
2022-12-15 11:15:33 +0100ec(~ec@gateway/tor-sasl/ec)
2022-12-15 11:18:18 +0100alphabeta(~kilolympu@213.144.144.24)
2022-12-15 11:20:02 +0100Lord_of_Life_(~Lord@user/lord-of-life/x-2819915)
2022-12-15 11:20:58 +0100Lord_of_Life(~Lord@user/lord-of-life/x-2819915) (Ping timeout: 252 seconds)
2022-12-15 11:22:37 +0100eggplantade(~Eggplanta@2600:1700:38c5:d800:f49d:401d:a888:f078)
2022-12-15 11:22:48 +0100Lord_of_Life_Lord_of_Life
2022-12-15 11:25:32 +0100azimut(~azimut@gateway/tor-sasl/azimut) (Ping timeout: 255 seconds)
2022-12-15 11:26:50 +0100eggplantade(~Eggplanta@2600:1700:38c5:d800:f49d:401d:a888:f078) (Ping timeout: 252 seconds)
2022-12-15 11:29:02 +0100freeside(~mengwong@nat-veranstaltungen.uni-saarland.de) (Ping timeout: 252 seconds)
2022-12-15 11:29:48 +0100alphabeta(~kilolympu@213.144.144.24) (Ping timeout: 265 seconds)
2022-12-15 11:32:16 +0100coot(~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba) (Quit: coot)
2022-12-15 11:33:20 +0100kilolympus(~kilolympu@213.144.144.24)
2022-12-15 11:34:50 +0100kilolympus(~kilolympu@213.144.144.24) (Read error: Connection reset by peer)
2022-12-15 11:38:20 +0100kilolympus(~kilolympu@213.144.144.24)
2022-12-15 11:38:36 +0100jakalx(~jakalx@base.jakalx.net) ()
2022-12-15 11:41:29 +0100jakalx(~jakalx@base.jakalx.net)
2022-12-15 11:42:17 +0100freeside(~mengwong@eduroam-134-96-204-30.uni-saarland.de)
2022-12-15 11:42:59 +0100fizbin(~fizbin@user/fizbin)
2022-12-15 11:51:26 +0100dextaa8(~DV@user/dextaa)
2022-12-15 11:51:28 +0100CiaoSen(~Jura@p200300c95730b6002a3a4dfffe84dbd5.dip0.t-ipconnect.de)
2022-12-15 11:53:06 +0100dextaa(~DV@user/dextaa) (Ping timeout: 256 seconds)
2022-12-15 11:53:06 +0100dextaa8dextaa
2022-12-15 12:00:03 +0100 <mauke> :t join (maybe . join)
2022-12-15 12:00:04 +0100 <lambdabot> (a1 -> a1 -> a2) -> Maybe a1 -> a1 -> a2
2022-12-15 12:00:46 +0100MajorBiscuit(~MajorBisc@145.94.137.174) (Quit: WeeChat 3.6)
2022-12-15 12:00:57 +0100MajorBiscuit(~MajorBisc@145.94.137.174)
2022-12-15 12:02:45 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
2022-12-15 12:04:07 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
2022-12-15 12:04:48 +0100econo(uid147250@user/econo) (Quit: Connection closed for inactivity)
2022-12-15 12:09:59 +0100freeside(~mengwong@eduroam-134-96-204-30.uni-saarland.de) (Ping timeout: 255 seconds)
2022-12-15 12:11:41 +0100xff0x_(~xff0x@ai071162.d.east.v6connect.net)
2022-12-15 12:12:30 +0100use-value(~Thunderbi@2a00:23c6:8a03:2f01:39df:b639:fbf4:175b) (Remote host closed the connection)
2022-12-15 12:12:39 +0100crazazy(~user@2001:67c:2564:a307:4423:5622:90d3:16c3)
2022-12-15 12:12:49 +0100use-value(~Thunderbi@2a00:23c6:8a03:2f01:39df:b639:fbf4:175b)
2022-12-15 12:13:07 +0100 <dminuoso> albet70: Not that I know of.
2022-12-15 12:13:58 +0100kilolympus(~kilolympu@213.144.144.24) (Read error: Connection reset by peer)
2022-12-15 12:17:26 +0100 <[exa]> albet70: depending on the types around you might put the >>z out of the case and make `doSomethingElse` prevent the >> from acting (such as with Left)
2022-12-15 12:17:41 +0100 <[exa]> but that's kludgey already
2022-12-15 12:18:30 +0100freeside(~mengwong@eduroam-134-96-204-30.uni-saarland.de)
2022-12-15 12:18:35 +0100 <dminuoso> To some degree this reminds me of `switch` in flatparse
2022-12-15 12:18:44 +0100 <dminuoso> Which lets you write:
2022-12-15 12:19:41 +0100 <dminuoso> $(switch [| case _ of "foo" -> pure True; "bar" -> pure False |])
2022-12-15 12:19:51 +0100 <dminuoso> Which implicitly generates a default case
2022-12-15 12:20:21 +0100 <dminuoso> (You can also write it yourself, but if not a sensible `_ -> empty` branch will be generated)
2022-12-15 12:46:11 +0100`2jt(~jtomas@84.red-88-17-186.dynamicip.rima-tde.net) (Ping timeout: 256 seconds)
2022-12-15 12:50:26 +0100freeside(~mengwong@eduroam-134-96-204-30.uni-saarland.de) (Ping timeout: 252 seconds)
2022-12-15 12:55:26 +0100`2jt(~jtomas@84.red-88-17-186.dynamicip.rima-tde.net)
2022-12-15 12:58:24 +0100JordiGH(~jordi@user/jordigh)
2022-12-15 13:00:14 +0100use-value(~Thunderbi@2a00:23c6:8a03:2f01:39df:b639:fbf4:175b) (Ping timeout: 246 seconds)
2022-12-15 13:01:47 +0100use-value(~Thunderbi@2a00:23c6:8a03:2f01:39df:b639:fbf4:175b)
2022-12-15 13:09:04 +0100azimut(~azimut@gateway/tor-sasl/azimut)
2022-12-15 13:09:31 +0100`2jt(~jtomas@84.red-88-17-186.dynamicip.rima-tde.net) (Quit: Leaving)
2022-12-15 13:13:37 +0100freeside(~mengwong@nat-veranstaltungen.uni-saarland.de)
2022-12-15 13:17:51 +0100CiaoSen(~Jura@p200300c95730b6002a3a4dfffe84dbd5.dip0.t-ipconnect.de) (Ping timeout: 260 seconds)
2022-12-15 13:19:05 +0100shriekingnoise(~shrieking@186.137.167.202)
2022-12-15 13:21:49 +0100ellensol(~ln@pc-ellar188.it.uu.se) (Quit: leaving)
2022-12-15 13:23:22 +0100freeside(~mengwong@nat-veranstaltungen.uni-saarland.de) (Ping timeout: 272 seconds)
2022-12-15 13:23:57 +0100jpds2(~jpds@gateway/tor-sasl/jpds) (Remote host closed the connection)
2022-12-15 13:24:54 +0100jpds2(~jpds@gateway/tor-sasl/jpds)
2022-12-15 13:29:09 +0100Kaiepi(~Kaiepi@108.175.84.104) (Quit: Leaving)
2022-12-15 13:30:39 +0100coot(~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba)
2022-12-15 13:35:32 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
2022-12-15 13:40:05 +0100mmhat(~mmh@p200300f1c71eb3c8ee086bfffe095315.dip0.t-ipconnect.de)
2022-12-15 13:42:30 +0100jmdaemon(~jmdaemon@user/jmdaemon) (Ping timeout: 252 seconds)
2022-12-15 13:44:50 +0100mmhat(~mmh@p200300f1c71eb3c8ee086bfffe095315.dip0.t-ipconnect.de) (Client Quit)
2022-12-15 13:46:27 +0100Guest23(~Guest23@27.57.46.219)
2022-12-15 13:56:17 +0100Kaiepi(~Kaiepi@108.175.84.104)
2022-12-15 14:08:26 +0100FinnElija(~finn_elij@user/finn-elija/x-0085643) (Ping timeout: 255 seconds)
2022-12-15 14:09:47 +0100Digit(~user@user/digit) (Ping timeout: 268 seconds)
2022-12-15 14:10:43 +0100FinnElija(~finn_elij@user/finn-elija/x-0085643)
2022-12-15 14:12:52 +0100bgs(~bgs@212-85-160-171.dynamic.telemach.net)
2022-12-15 14:16:14 +0100Guest23(~Guest23@27.57.46.219) (Ping timeout: 252 seconds)
2022-12-15 14:17:23 +0100unit73e(~emanuel@2001:818:e8dd:7c00:656:e5ff:fe72:9d36)
2022-12-15 14:21:42 +0100freeside(~mengwong@nat-veranstaltungen.uni-saarland.de)
2022-12-15 14:22:14 +0100azimut(~azimut@gateway/tor-sasl/azimut) (Remote host closed the connection)
2022-12-15 14:23:32 +0100haritz(~hrtz@2a02:8010:65b5:0:6009:6384:e3cb:2220)
2022-12-15 14:23:33 +0100haritz(~hrtz@2a02:8010:65b5:0:6009:6384:e3cb:2220) (Changing host)
2022-12-15 14:23:33 +0100haritz(~hrtz@user/haritz)
2022-12-15 14:28:09 +0100pavonia(~user@user/siracusa) (Quit: Bye!)
2022-12-15 14:29:52 +0100freeside(~mengwong@nat-veranstaltungen.uni-saarland.de) (Ping timeout: 272 seconds)
2022-12-15 14:36:10 +0100bitdex(~bitdex@gateway/tor-sasl/bitdex) (Quit: = "")
2022-12-15 14:37:47 +0100Hercules1(~Hercules@ti0018a400-7782.bb.online.no)
2022-12-15 14:38:46 +0100Hercules1(~Hercules@ti0018a400-7782.bb.online.no) (Quit: Leaving)
2022-12-15 14:45:42 +0100freeside(~mengwong@nat-veranstaltungen.uni-saarland.de)
2022-12-15 14:50:29 +0100freeside(~mengwong@nat-veranstaltungen.uni-saarland.de) (Ping timeout: 268 seconds)
2022-12-15 14:55:42 +0100jpds2(~jpds@gateway/tor-sasl/jpds) (Remote host closed the connection)
2022-12-15 14:57:39 +0100jpds2(~jpds@gateway/tor-sasl/jpds)
2022-12-15 14:58:41 +0100byorgey(~byorgey@155.138.238.211) (Quit: leaving)
2022-12-15 14:59:45 +0100ec(~ec@gateway/tor-sasl/ec) (Remote host closed the connection)
2022-12-15 14:59:52 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
2022-12-15 15:00:39 +0100ec(~ec@gateway/tor-sasl/ec)
2022-12-15 15:01:29 +0100ystael(~ystael@user/ystael)
2022-12-15 15:03:24 +0100freeside(~mengwong@nat-veranstaltungen.uni-saarland.de)
2022-12-15 15:08:12 +0100thegeekinside(~thegeekin@189.217.82.244)
2022-12-15 15:08:47 +0100x22x22x(~x88x88x@2001:19f0:5:39a8:5400:3ff:feb6:73cb) (Ping timeout: 252 seconds)
2022-12-15 15:09:46 +0100freeside(~mengwong@nat-veranstaltungen.uni-saarland.de) (Ping timeout: 252 seconds)
2022-12-15 15:12:16 +0100Unicorn_Princess(~Unicorn_P@user/Unicorn-Princess/x-3540542)
2022-12-15 15:12:42 +0100troydm(~troydm@host-176-37-124-197.b025.la.net.ua) (Ping timeout: 252 seconds)
2022-12-15 15:14:52 +0100eggplantade(~Eggplanta@104-55-37-220.lightspeed.sntcca.sbcglobal.net)
2022-12-15 15:17:05 +0100coot(~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba) (Quit: coot)
2022-12-15 15:24:04 +0100freeside(~mengwong@nat-veranstaltungen.uni-saarland.de)
2022-12-15 15:30:18 +0100son0p(~ff@2604:3d08:5b7f:5540::4026) (Ping timeout: 252 seconds)
2022-12-15 15:31:33 +0100eggplantade(~Eggplanta@104-55-37-220.lightspeed.sntcca.sbcglobal.net) (Remote host closed the connection)
2022-12-15 15:37:00 +0100razetime(~quassel@49.207.203.213) (Quit: https://quassel-irc.org - Chat comfortably. Anywhere.)
2022-12-15 15:37:42 +0100Digit(~user@user/digit)
2022-12-15 15:45:10 +0100wroathe(~wroathe@207-153-38-140.fttp.usinternet.com)
2022-12-15 15:45:10 +0100wroathe(~wroathe@207-153-38-140.fttp.usinternet.com) (Changing host)
2022-12-15 15:45:10 +0100wroathe(~wroathe@user/wroathe)
2022-12-15 15:46:38 +0100Xeroine(~Xeroine@user/xeroine) (Quit: ZNC 1.8.2+deb2+b1 - https://znc.in)
2022-12-15 15:47:58 +0100Xeroine(~Xeroine@user/xeroine)
2022-12-15 15:52:31 +0100CiaoSen(~Jura@p200300c95730b6002a3a4dfffe84dbd5.dip0.t-ipconnect.de)
2022-12-15 15:52:53 +0100chele_(~chele@user/chele)
2022-12-15 15:55:43 +0100chele(~chele@user/chele) (Ping timeout: 260 seconds)
2022-12-15 15:55:46 +0100festive_kurbus(~festive_k@user/kurbus)
2022-12-15 15:56:04 +0100wroathe(~wroathe@user/wroathe) (Ping timeout: 260 seconds)
2022-12-15 15:56:23 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
2022-12-15 15:57:11 +0100crazazy(~user@2001:67c:2564:a307:4423:5622:90d3:16c3) (Ping timeout: 252 seconds)
2022-12-15 16:00:08 +0100eggplantade(~Eggplanta@2600:1700:38c5:d800:f49d:401d:a888:f078)
2022-12-15 16:05:25 +0100FragByte_(~christian@user/fragbyte)
2022-12-15 16:06:29 +0100polux(~polux@51-15-169-172.rev.poneytelecom.eu) (Quit: The Lounge - https://thelounge.github.io)
2022-12-15 16:07:01 +0100FragByte(~christian@user/fragbyte) (Ping timeout: 252 seconds)
2022-12-15 16:07:01 +0100FragByte_FragByte
2022-12-15 16:08:16 +0100polux(~polux@51-15-169-172.rev.poneytelecom.eu)
2022-12-15 16:09:41 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
2022-12-15 16:10:23 +0100festive_kurbus(~festive_k@user/kurbus) (Quit: Client closed)
2022-12-15 16:11:33 +0100eggplantade(~Eggplanta@2600:1700:38c5:d800:f49d:401d:a888:f078) (Remote host closed the connection)
2022-12-15 16:12:00 +0100polux(~polux@51-15-169-172.rev.poneytelecom.eu) (Client Quit)
2022-12-15 16:12:22 +0100polux(~polux@51-15-169-172.rev.poneytelecom.eu)
2022-12-15 16:15:00 +0100MajorBiscuit(~MajorBisc@145.94.137.174) (Ping timeout: 272 seconds)
2022-12-15 16:17:58 +0100lortabac(~lortabac@2a01:e0a:541:b8f0:5ea7:443c:a1ac:4e5c) (Quit: WeeChat 2.8)
2022-12-15 16:24:21 +0100n0den1te(~n0den1te@223.178.87.40)
2022-12-15 16:29:14 +0100festive_kurbus(~festive_k@user/kurbus)
2022-12-15 16:30:36 +0100bontaq(~user@ool-45779fe5.dyn.optonline.net)
2022-12-15 16:32:05 +0100n0den1te(~n0den1te@223.178.87.40) ()
2022-12-15 16:35:44 +0100byorgey(~byorgey@155.138.238.211)
2022-12-15 16:38:06 +0100festive_kurbus(~festive_k@user/kurbus) (Quit: Client closed)
2022-12-15 16:39:14 +0100Sgeo(~Sgeo@user/sgeo)
2022-12-15 16:41:42 +0100eggplantade(~Eggplanta@2600:1700:38c5:d800:f49d:401d:a888:f078)
2022-12-15 16:47:13 +0100FinnElija(~finn_elij@user/finn-elija/x-0085643) (Remote host closed the connection)
2022-12-15 16:47:44 +0100FinnElija(~finn_elij@user/finn-elija/x-0085643)
2022-12-15 16:50:28 +0100merijn(~merijn@195.114.232.74) (Quit: Reconnecting)
2022-12-15 16:50:41 +0100merijn(~merijn@195.114.232.74)
2022-12-15 16:50:45 +0100[itchyjunk](~itchyjunk@user/itchyjunk/x-7353470)
2022-12-15 16:54:00 +0100jao(~jao@cpc103048-sgyl39-2-0-cust502.18-2.cable.virginm.net)
2022-12-15 17:00:05 +0100zarel[m](~zarelitma@2001:470:69fc:105::1:fcfb) (Quit: You have been kicked for being idle)
2022-12-15 17:05:02 +0100motherfsck(~motherfsc@user/motherfsck)
2022-12-15 17:07:49 +0100eggplantade(~Eggplanta@2600:1700:38c5:d800:f49d:401d:a888:f078) (Remote host closed the connection)
2022-12-15 17:10:58 +0100L29Ah(~L29Ah@wikipedia/L29Ah)
2022-12-15 17:14:41 +0100Xeroine(~Xeroine@user/xeroine) (Quit: ZNC 1.8.2+deb2+b1 - https://znc.in)
2022-12-15 17:15:00 +0100Xeroine(~Xeroine@user/xeroine)
2022-12-15 17:19:00 +0100paulpaul1076(~textual@95-29-5-111.broadband.corbina.ru)
2022-12-15 17:21:26 +0100FinnElija(~finn_elij@user/finn-elija/x-0085643) (Write error: Connection reset by peer)
2022-12-15 17:21:26 +0100chexum_(~quassel@gateway/tor-sasl/chexum) (Read error: Connection reset by peer)
2022-12-15 17:21:26 +0100jpds2(~jpds@gateway/tor-sasl/jpds) (Read error: Connection reset by peer)
2022-12-15 17:21:46 +0100chexum(~quassel@gateway/tor-sasl/chexum)
2022-12-15 17:22:03 +0100jpds2(~jpds@gateway/tor-sasl/jpds)
2022-12-15 17:22:51 +0100festive_kurbus(~festive_k@user/kurbus)
2022-12-15 17:23:41 +0100FinnElija(~finn_elij@user/finn-elija/x-0085643)
2022-12-15 17:31:54 +0100Digit(~user@user/digit) (Remote host closed the connection)
2022-12-15 17:34:03 +0100Digit(~user@user/digit)
2022-12-15 17:34:48 +0100merijn(~merijn@195.114.232.74) (Ping timeout: 272 seconds)
2022-12-15 17:40:06 +0100Xeroine(~Xeroine@user/xeroine) (Quit: ZNC 1.8.2+deb2+b1 - https://znc.in)
2022-12-15 17:40:55 +0100Xeroine(~Xeroine@user/xeroine)
2022-12-15 17:41:31 +0100son0p(~ff@2604:3d08:5b7f:5540::d832)
2022-12-15 17:42:08 +0100troydm(~troydm@host-176-37-124-197.b025.la.net.ua)
2022-12-15 17:49:27 +0100ec(~ec@gateway/tor-sasl/ec) (Write error: Connection reset by peer)
2022-12-15 17:50:29 +0100ec(~ec@gateway/tor-sasl/ec)
2022-12-15 17:56:26 +0100 <mira> hmm, unsafeCoerce can coerce between data Foo a b = Foo a b and a tuple (a,b) -- is there a way I could convince coerce to do that too?
2022-12-15 17:57:32 +0100 <dminuoso> Not with an incompatible representation.
2022-12-15 17:57:48 +0100 <dminuoso> You can use `newtype Foo a b = Foo (a, b)`, then you get to coerce
2022-12-15 17:58:17 +0100 <mira> yeah, that's what I'm doing rn, with a pattern synonym to get to write pattern matches on Foo in a nicer way, but that's a bit of a hassle
2022-12-15 17:58:28 +0100 <geekosaur> aren't they the same rep, though? but `coerce` only works through newtypes, it cares not about actual representations
2022-12-15 17:59:17 +0100 <mira> yeah, my understanding is that the representation is the same, coerce just doesn't know that because Coercible instances are only generated for newtypes
2022-12-15 17:59:28 +0100 <geekosaur> (`(a,b)` is `(,) a b` internally, with a single constructor `Foo` is exactly the same rep)
2022-12-15 18:00:22 +0100 <dminuoso> geekosaur: I guess in this particular case it might hold
2022-12-15 18:01:05 +0100ec(~ec@gateway/tor-sasl/ec) (Remote host closed the connection)
2022-12-15 18:01:09 +0100 <dminuoso> But this doesnt work in general, consider something like `data Foo = Foo {-# UNPACK #-} Word8 {-# UNPACK #-} Word8`, wouldnt the representation especially in 9.4 depend on optimizations?
2022-12-15 18:01:30 +0100 <geekosaur> yes, in that case
2022-12-15 18:01:32 +0100ec(~ec@gateway/tor-sasl/ec)
2022-12-15 18:02:31 +0100 <geekosaur> although using a hypothetical Coercible instance might suppress the optimization, I don't know
2022-12-15 18:03:13 +0100 <dminuoso> Given that the coerce could happen across modules or even packages, that would invalidate the optimization entirely
2022-12-15 18:03:22 +0100 <dminuoso> Or demand that it unconditionally be used
2022-12-15 18:04:25 +0100 <geekosaur> true
2022-12-15 18:04:30 +0100Tuplanolla(~Tuplanoll@91-159-68-152.elisa-laajakaista.fi)
2022-12-15 18:04:48 +0100 <geekosaur> I was wondering about the opposite, ghc unpacking a tuple as an optimization
2022-12-15 18:05:03 +0100 <geekosaur> but as you said, it'd have to know about other uses
2022-12-15 18:05:33 +0100 <geekosaur> suppose it could only do that if it knew it couldnt escape the module
2022-12-15 18:07:10 +0100festive_kurbus(~festive_k@user/kurbus) (Quit: Client closed)
2022-12-15 18:08:19 +0100eggplantade(~Eggplanta@2600:1700:38c5:d800:f49d:401d:a888:f078)
2022-12-15 18:09:04 +0100machinedgod(~machinedg@d198-53-218-113.abhsia.telus.net) (Ping timeout: 252 seconds)
2022-12-15 18:10:28 +0100 <monochrom> Inlining can help customizing for use sites.
2022-12-15 18:11:06 +0100machinedgod(~machinedg@d198-53-218-113.abhsia.telus.net)
2022-12-15 18:11:36 +0100mvk(~mvk@2607:fea8:5ce3:8500::6126)
2022-12-15 18:11:39 +0100mvk(~mvk@2607:fea8:5ce3:8500::6126) (Client Quit)
2022-12-15 18:12:21 +0100thegeekinside(~thegeekin@189.217.82.244) (Read error: Connection reset by peer)
2022-12-15 18:12:32 +0100thegeekinside(~thegeekin@189.217.82.244)
2022-12-15 18:12:41 +0100eggplantade(~Eggplanta@2600:1700:38c5:d800:f49d:401d:a888:f078) (Ping timeout: 255 seconds)
2022-12-15 18:12:46 +0100 <dminuoso> That said, even the original paper explicitly defines representational equality to deal with newtypes, and subtly implies that runtime equality is only guaranteed by newtypes
2022-12-15 18:13:40 +0100 <dminuoso> I suppose role inference would become incredibly messy, if something *more* than from haskell itself would enter this equation
2022-12-15 18:15:18 +0100freeside(~mengwong@nat-veranstaltungen.uni-saarland.de) (Ping timeout: 252 seconds)
2022-12-15 18:15:29 +0100 <dminuoso> you would have to display role inference to be sound and optimal in the presence of some adhoc introduction of GHC information
2022-12-15 18:15:48 +0100 <dminuoso> and that it always terminates
2022-12-15 18:15:59 +0100 <dminuoso> (which is the three theorems the original coercible paper proves)
2022-12-15 18:19:48 +0100chele_(~chele@user/chele) (Remote host closed the connection)
2022-12-15 18:27:02 +0100festive_kurbus(~festive_k@user/kurbus)
2022-12-15 18:30:44 +0100mtmm(~mtmm@89-166-7-216.bb.dnainternet.fi) (Quit: leaving)
2022-12-15 18:31:48 +0100 <dminuoso> geekosaur: The original paper https://www.microsoft.com/en-us/research/uploads/prod/2018/05/coercible-JFP.pdf actually touches it in 8.5 see maybe2option
2022-12-15 18:31:58 +0100 <dminuoso> So it is at least briefly discussed
2022-12-15 18:32:42 +0100tzh(~tzh@c-24-21-73-154.hsd1.wa.comcast.net)
2022-12-15 18:32:59 +0100 <dminuoso> But certainly some problems come to mind, like given `data MaybeS a = None | Zero | One a` and `data Another a = A | B | C a`
2022-12-15 18:33:08 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
2022-12-15 18:33:19 +0100 <dminuoso> Would they be coercible too? There's certainly something that *can* be done at runtime
2022-12-15 18:33:51 +0100 <dminuoso> And other things like reordering the constructors could drastically alter the meaning, especailly in a world where you have an expectancy of role `representational`
2022-12-15 18:34:03 +0100acidjnk(~acidjnk@p200300d6e7137a00f9d7394677563a85.dip0.t-ipconnect.de)
2022-12-15 18:34:21 +0100 <dminuoso> And regarding the previous sentence, Im not sure this is a sensible coercion to do.
2022-12-15 18:35:20 +0100 <dminuoso> THough to some degree newtype coercion presents that same problem alreayd, say if you had (Int, Int) to (IntWrapped, AnotherIntWrapped) or (AnotherIntWrapped, IntWrapped)
2022-12-15 18:35:27 +0100 <dminuoso> Either can happen with no restriction
2022-12-15 18:35:31 +0100econo(uid147250@user/econo)
2022-12-15 18:36:23 +0100festive_kurbus(~festive_k@user/kurbus) (Quit: Client closed)
2022-12-15 18:36:37 +0100festive_kurbus(~festive_k@user/kurbus)
2022-12-15 18:37:24 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
2022-12-15 18:39:35 +0100fserucas(~fserucas@2001:818:e376:a400:fb92:70c1:dd88:c7d7) (Quit: Leaving)
2022-12-15 18:40:25 +0100thegeekinside(~thegeekin@189.217.82.244) (Read error: Connection reset by peer)
2022-12-15 18:41:01 +0100thegeekinside(~thegeekin@189.217.82.244)
2022-12-15 18:43:57 +0100festive_kurbus(~festive_k@user/kurbus) (Quit: Client closed)
2022-12-15 18:47:08 +0100festive_kurbus(~festive_k@user/kurbus)
2022-12-15 18:48:50 +0100jakalx(~jakalx@base.jakalx.net) (Error from remote client)
2022-12-15 18:51:22 +0100coot(~coot@213.134.171.3)
2022-12-15 18:54:17 +0100mbuf(~Shakthi@49.204.116.170) (Quit: Leaving)
2022-12-15 18:55:51 +0100jwalker(~jwalker@89.23.145.133)
2022-12-15 18:56:33 +0100jwalker(~jwalker@89.23.145.133) (Remote host closed the connection)
2022-12-15 18:57:25 +0100jakalx(~jakalx@base.jakalx.net)
2022-12-15 18:58:04 +0100Topsi(~Topsi@dyndsl-095-033-225-198.ewe-ip-backbone.de)
2022-12-15 18:59:11 +0100 <monochrom> MaybeS and Another are identical in practice. But we also like to not encourage abuse, even if compilers won't make them different out of the blue.
2022-12-15 18:59:46 +0100 <monochrom> The newtype condition is pretty robust though because the Haskell Report has a guarantee already.
2022-12-15 19:00:05 +0100L29Ah(~L29Ah@wikipedia/L29Ah) ()
2022-12-15 19:00:56 +0100 <monochrom> More deeply what the Haskell Report says is a formal way to state a social expectation and intent that also supports Coercible.
2022-12-15 19:01:52 +0100 <monochrom> So, coercing between MaybeS and Another is socially unacceptable, but coercing between newtype equivalents is socially acceptable.
2022-12-15 19:02:13 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
2022-12-15 19:02:30 +0100 <monochrom> Sorry but lately I like to play the "it's a social construct" card! >:) Must have been bad influence from the philosophies behind intuitionistic logic...
2022-12-15 19:02:40 +0100coot(~coot@213.134.171.3) (Quit: coot)
2022-12-15 19:03:39 +0100 <monochrom> Now I go back to debating with myself how much to decouple type inference from unification...
2022-12-15 19:05:17 +0100unit73e(~emanuel@2001:818:e8dd:7c00:656:e5ff:fe72:9d36) (Ping timeout: 256 seconds)
2022-12-15 19:06:05 +0100 <monochrom> Here is one aspect of it. The unification algorithm lives in a monad that has state (table of substitutions, counter for the next fresh variable) and error (occurs check, mismatch, but not var-not-found, unification itself doesn't have var-not-found).
2022-12-15 19:06:26 +0100vpan(~0@212.117.1.172) (Quit: Leaving.)
2022-12-15 19:06:50 +0100 <monochrom> The type inference algorithm has to live in that plus reader (environment for vars' types) and one more error (var-not-found).
2022-12-15 19:08:30 +0100 <monochrom> I am thinking whether I should just use one single common big monad for both, or define the latter to be an additional layer over the former.
2022-12-15 19:08:31 +0100bitmapper(uid464869@id-464869.lymington.irccloud.com)
2022-12-15 19:08:49 +0100 <AndreasK> I wonder why maximumBy doesn't take a function returning an `a` instead of Ord. Would allow for a more efficient implementation.
2022-12-15 19:09:11 +0100azimut(~azimut@gateway/tor-sasl/azimut)
2022-12-15 19:10:26 +0100jao(~jao@cpc103048-sgyl39-2-0-cust502.18-2.cable.virginm.net) (Ping timeout: 272 seconds)
2022-12-15 19:10:56 +0100 <Rembane> AndreasK: You can use some nice Monoid/Semigroup newtype instead.
2022-12-15 19:11:22 +0100 <monochrom> It can be argued both ways.
2022-12-15 19:11:55 +0100 <monochrom> Half of the time a comparator is more efficient, the other half a binary max is more efficient.
2022-12-15 19:12:07 +0100 <Rembane> Both versions are needed imo
2022-12-15 19:12:10 +0100 <AndreasK> Rembane: I'm not sure I follow how a newtype would help there. Maybe you are thinking of maximum?
2022-12-15 19:12:44 +0100 <monochrom> If I were to decide, I side with the comparator version. "a -> a -> Ordering" is more self-documenting than "a -> a -> a".
2022-12-15 19:13:11 +0100 <Rembane> AndreasK: This one! https://hackage.haskell.org/package/base-4.17.0.0/docs/Data-Semigroup.html#t:Max
2022-12-15 19:13:42 +0100 <monochrom> If you already have a binary max, then what Rembane said about using a plain fold.
2022-12-15 19:14:28 +0100 <AndreasK> Rembane: If you have a Ord instance already (as `Max` requires) I would just use maximum.
2022-12-15 19:15:30 +0100 <AndreasK> monochrom: I guess that's a reasonable stance. I'm just looking at the code generated by maximumBy and am annoyed by the extra branches from casing on the Ord result
2022-12-15 19:15:43 +0100 <Rembane> AndreasK: You can use foldMap to get something with Max, but yeah...
2022-12-15 19:16:31 +0100 <monochrom> "foldl1' yourmax" is very short, so no one thought of giving it a name and registering it in a library.
2022-12-15 19:17:12 +0100 <monochrom> Whereas comparator-based maximumBy is much longer and actually warrants librarying and reuse.
2022-12-15 19:18:56 +0100 <monochrom> But you should aim higher.
2022-12-15 19:20:01 +0100 <monochrom> You should demand veryGeneralMaximumBy :: Foldable t => Either (a -> a -> a) (a -> a -> Ordering) -> t a -> a >:)
2022-12-15 19:21:05 +0100 <EvanR> I thought you were going to say the more efficient implementation would be to max pairs, then max pairs of results of that, and so on
2022-12-15 19:21:37 +0100 <AndreasK> I've head that being called a tree fold
2022-12-15 19:21:56 +0100 <AndreasK> *heard
2022-12-15 19:22:26 +0100eggplantade(~Eggplanta@104-55-37-220.lightspeed.sntcca.sbcglobal.net)
2022-12-15 19:23:16 +0100 <monochrom> In terms of branching, here is the thing: A lot of data types compute binary max by branching, too. foldl1' yourmax does not avoid that branching.
2022-12-15 19:23:30 +0100 <monochrom> (for those data types)
2022-12-15 19:23:47 +0100 <monochrom> or rather, s/your/their/
2022-12-15 19:24:09 +0100doyougnu(~doyougnu@cpe-74-69-132-225.stny.res.rr.com)
2022-12-15 19:25:38 +0100 <monochrom> To a large extent the only counterexample I have seen is if you take Word8 as a bit vector/set and you repurpose "max" to mean least upper bound i.e. union i.e. bitwise-or.
2022-12-15 19:26:16 +0100 <AndreasK> For int you could compile max to a cmove, but we sadly don't currently.
2022-12-15 19:26:35 +0100 <monochrom> How does cmove work?
2022-12-15 19:27:17 +0100 <AndreasK> Conditional move at the assembly level, you emit the compare instruction and based on the result the following conditional move gets executed or not
2022-12-15 19:27:31 +0100 <AndreasK> It's generally better than branching
2022-12-15 19:27:32 +0100jao(~jao@cpc103048-sgyl39-2-0-cust502.18-2.cable.virginm.net)
2022-12-15 19:27:35 +0100 <monochrom> Ah yeah that, I think I've heard of it before.
2022-12-15 19:27:48 +0100unit73e(~emanuel@2001:818:e8dd:7c00:656:e5ff:fe72:9d36)
2022-12-15 19:28:16 +0100aeroplane(~user@user/aeroplane) (Ping timeout: 252 seconds)
2022-12-15 19:28:18 +0100wroathe(~wroathe@207-153-38-140.fttp.usinternet.com)
2022-12-15 19:28:18 +0100wroathe(~wroathe@207-153-38-140.fttp.usinternet.com) (Changing host)
2022-12-15 19:28:18 +0100wroathe(~wroathe@user/wroathe)
2022-12-15 19:28:49 +0100 <monochrom> Yeah the ALU does an internal "branching" that doesn't ruin the execution pipeline etc.
2022-12-15 19:29:34 +0100 <monochrom> and "compare instruction" is just subtraction.
2022-12-15 19:35:46 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
2022-12-15 19:36:24 +0100wroathe(~wroathe@user/wroathe) (Ping timeout: 272 seconds)
2022-12-15 19:40:22 +0100 <mauke> hahahaha
2022-12-15 19:40:34 +0100 <mauke> I just did AoC day 12 part 2
2022-12-15 19:40:50 +0100festive_kurbus(~festive_k@user/kurbus) (Quit: Client closed)
2022-12-15 19:41:23 +0100 <mauke> my code changes compared to part 1 are rather modest
2022-12-15 19:41:36 +0100 <mauke> before: main = interact ((++ "\n") . show . process . arrayFromLines . lines)
2022-12-15 19:41:39 +0100 <mauke> after: main = interact ((++ "\n") . show . process . arrayFromLines . lines . map (\case 'a' -> 'S'; c -> c))
2022-12-15 19:43:09 +0100 <mauke> the problem asks you to find the shortest path through a maze from a start symbol S to an end symbol E
2022-12-15 19:43:23 +0100 <int-e> yeah it was a rather weak twist
2022-12-15 19:43:53 +0100 <mauke> part 2 generalizes it to finding the shortest path from any starting symbol (and all the 'a's are also start symbols)
2022-12-15 19:44:14 +0100 <mauke> only my algorithm was already fully general, finding the shortest path between any start symbol and any end symbol :-D
2022-12-15 19:44:21 +0100 <int-e> I think I had to change more than just == 'S' to `elem` "Sa" but I forgot why.
2022-12-15 19:45:04 +0100 <mauke> did you do any fancy path finding or just brute-force search?
2022-12-15 19:45:23 +0100 <int-e> standard bfs
2022-12-15 19:45:30 +0100 <mauke> same
2022-12-15 19:46:10 +0100 <mauke> I hadn't done it before, so I wrote it up in imperative pseudocode using sets
2022-12-15 19:46:27 +0100 <mauke> then translated it to a bunch of folds, threading the state sets through
2022-12-15 19:46:31 +0100 <mauke> worked on the first try :-)
2022-12-15 19:52:11 +0100CiaoSen(~Jura@p200300c95730b6002a3a4dfffe84dbd5.dip0.t-ipconnect.de) (Ping timeout: 260 seconds)
2022-12-15 19:52:27 +0100 <monochrom> Perhaps they are fishing for a solution to the open problem: Is there a single-pair algorithm that's big-O-faster than single-source algorithms?
2022-12-15 19:58:41 +0100ksqsf(~user@134.209.106.31)
2022-12-15 19:59:05 +0100ksqsf(~user@134.209.106.31) ()
2022-12-15 20:09:12 +0100ksqsf(~user@134.209.106.31)
2022-12-15 20:09:26 +0100ksqsf(~user@134.209.106.31) (ERC 5.4.1 (IRC client for GNU Emacs 29.0.60))
2022-12-15 20:10:56 +0100ksqsf(~user@134.209.106.31)
2022-12-15 20:12:37 +0100coot(~coot@213.134.171.3)
2022-12-15 20:13:09 +0100ksqsf(~user@134.209.106.31) (ERC 5.4.1 (IRC client for GNU Emacs 29.0.60))
2022-12-15 20:19:34 +0100ft(~ft@p4fc2a257.dip0.t-ipconnect.de)
2022-12-15 20:21:56 +0100akegalj(~akegalj@141-136-165-175.dsl.iskon.hr)
2022-12-15 20:26:03 +0100jakalx(~jakalx@base.jakalx.net) ()
2022-12-15 20:29:40 +0100Xeroine(~Xeroine@user/xeroine) (Quit: ZNC 1.8.2+deb2+b1 - https://znc.in)
2022-12-15 20:30:08 +0100ksqsf(~user@134.209.106.31)
2022-12-15 20:30:29 +0100Xeroine(~Xeroine@user/xeroine)
2022-12-15 20:31:49 +0100jakalx(~jakalx@base.jakalx.net)
2022-12-15 20:35:14 +0100acidjnk(~acidjnk@p200300d6e7137a00f9d7394677563a85.dip0.t-ipconnect.de) (Ping timeout: 246 seconds)
2022-12-15 20:35:18 +0100doyougnu(~doyougnu@cpe-74-69-132-225.stny.res.rr.com) (Ping timeout: 272 seconds)
2022-12-15 20:37:12 +0100fizbin(~fizbin@user/fizbin) (Ping timeout: 272 seconds)
2022-12-15 20:39:11 +0100akegalj(~akegalj@141-136-165-175.dsl.iskon.hr) (Quit: leaving)
2022-12-15 20:39:35 +0100voidzero(~voidzero@user/voidzero)
2022-12-15 20:48:53 +0100fizbin(~fizbin@user/fizbin)
2022-12-15 20:50:17 +0100Guest75(Guest75@2a01:7e01::f03c:92ff:fe5d:7b18)
2022-12-15 20:58:06 +0100VY2(~user@217.107.126.130)
2022-12-15 21:02:49 +0100gmg(~user@user/gehmehgeh)
2022-12-15 21:04:07 +0100NoOne(~NoOne@181.95.93.87)
2022-12-15 21:08:50 +0100lortabac(~lortabac@2a01:e0a:541:b8f0:7798:b400:fd36:b817)
2022-12-15 21:08:58 +0100 <EvanR> monochrom, ALU does internal branching, this is veering dangerously close to old lisp "everything is made of if statements at some level"
2022-12-15 21:10:29 +0100 <darkling> lifp?
2022-12-15 21:10:41 +0100acidjnk(~acidjnk@p200300d6e7137a0005c6f28ba6b2016c.dip0.t-ipconnect.de)
2022-12-15 21:11:09 +0100 <EvanR> most zachtronics games allow solutions which exploit something like, do everything all at once, then merge the answers just in time
2022-12-15 21:11:30 +0100 <monochrom> Haha everything is made of nand gates at some level, which are even better than if-statements >:)
2022-12-15 21:12:23 +0100 <monochrom> OK OK, half of everything. The other half is made of capacitors.
2022-12-15 21:12:43 +0100 <EvanR> it's a basic law of physics that the hamiltonian flow can't branch xD
2022-12-15 21:12:58 +0100 <EvanR> computation is impossible
2022-12-15 21:13:28 +0100 <monochrom> Wait a second, can't branch? Or can't resist to branch and find the least-action path?
2022-12-15 21:13:57 +0100 <EvanR> your orbit through phase space only goes straight and can't fork
2022-12-15 21:14:35 +0100 <geekosaur> the question becomes, is what appears to be a branch to us not?
2022-12-15 21:14:55 +0100 <EvanR> the quantum version is unitary flow
2022-12-15 21:15:01 +0100 <monochrom> Or must fork tremendously and find the optimum then erase all evidence of forking and show you only the "deterministic" optimum.
2022-12-15 21:15:34 +0100 <monochrom> I mean I am speaking this even in classical mechanics via the principle of least action.
2022-12-15 21:16:05 +0100 <monochrom> I mean you brought up hamilton so let's go langragian too!
2022-12-15 21:16:35 +0100 <EvanR> yeah beginning with classical uncertain blob in phase space, the bits of your blob will never merge or split or cross paths
2022-12-15 21:16:57 +0100CiaoSen(~Jura@p200300c95730b6002a3a4dfffe84dbd5.dip0.t-ipconnect.de)
2022-12-15 21:17:45 +0100 <monochrom> I think even in mathematics I can justify (or at least rationalize) defining R->R functions in terms of uncountably many if-statements.
2022-12-15 21:18:11 +0100FinnElija(~finn_elij@user/finn-elija/x-0085643) (Ping timeout: 255 seconds)
2022-12-15 21:21:01 +0100 <EvanR> I think what I'm saying is, if you build a machine that adds 1 volt to an input, it's [insert analogy to "every is a set in math"] to say it works by say, if 1V then 2V else if 2V then 3V else if ..., when there's a more suitable language for the behavior
2022-12-15 21:21:47 +0100 <monochrom> That much I agree.
2022-12-15 21:21:52 +0100 <EvanR> like avoiding a turing tarpit
2022-12-15 21:23:10 +0100 <EvanR> and if we're not standing on infinite if statements, maybe we don't have to use them in everyday code. All praise catamorphisms and such
2022-12-15 21:24:33 +0100 <monochrom> "more suitable language" does not imply "no other truth". Example: Haskell is really a more suitable language for my programs, but it does not imply that the truth is not that it gets translated to a ton of nand gates and capacitors.
2022-12-15 21:26:21 +0100 <EvanR> I love how haskell kind of relegated the actual if statement to "use this mostly when you really just want to say if something then this else that"
2022-12-15 21:26:35 +0100 <EvanR> at least that's how it felt coming from every other language
2022-12-15 21:26:56 +0100 <EvanR> it's for literal if statements and not for implementing the entire universe
2022-12-15 21:27:07 +0100 <monochrom> Going back to where it started, ALU having cmove is a fairly recent addition. Older ALUs were much simpler.
2022-12-15 21:27:10 +0100FinnElija(~finn_elij@user/finn-elija/x-0085643)
2022-12-15 21:27:48 +0100waleee(~waleee@h-176-10-137-138.NA.cust.bahnhof.se)
2022-12-15 21:28:04 +0100 <geekosaur> there are a few other languages where if is an expression instead of a statement
2022-12-15 21:28:18 +0100 <EvanR> cmove is great, but there's probably an even more efficient way to max two integers with silicon
2022-12-15 21:28:33 +0100 <EvanR> because... you're not limited to if statements xD
2022-12-15 21:28:36 +0100 <monochrom> Although, CPUs have had concurrency primitives for longer than cmove, and that one is way more complex, even "if" is dwarved.
2022-12-15 21:29:24 +0100 <EvanR> maybe, the max of a word is the bitwise max of bits, each of which is an OR
2022-12-15 21:29:40 +0100 <monochrom> That's the union I mentioned.
2022-12-15 21:29:58 +0100 <EvanR> not branching right
2022-12-15 21:30:27 +0100 <monochrom> But it won't give max 2 4 = 4.
2022-12-15 21:30:33 +0100 <voidzero> anyone here who has read Haskell Programming From First Principles?
2022-12-15 21:30:41 +0100 <EvanR> doh you're right
2022-12-15 21:31:21 +0100 <voidzero> I'm working my way through it, and while I get most concepts, I want to know if I'm too stupid for Haskell if I can't get the solution to some of the exercises
2022-12-15 21:31:33 +0100avicenzi(~avicenzi@2a00:ca8:a1f:b004::c32) (Ping timeout: 265 seconds)
2022-12-15 21:33:16 +0100 <monochrom> Not stupid. Some exercises are harder than the others.
2022-12-15 21:33:35 +0100 <geekosaur> there is very little "too stupid". there is a lot of having to unlearn concepts from other languages
2022-12-15 21:33:39 +0100pavonia(~user@user/siracusa)
2022-12-15 21:34:05 +0100 <monochrom> More positively, it is OK to consult people and get help.
2022-12-15 21:35:38 +0100 <monochrom> In general, true of any learning: The whole point of why "learning" exists in the first place is because you can't be expected to reinvent everything on your own.
2022-12-15 21:35:53 +0100 <voidzero> well, maybe, I'm not a programmer much although I can cook a mean zsh script. But, for example, "using takeWhile and dropWhile, write a function that takes a string and returns a list of strings, using spaces to separate the elements of the string into words." So, for example, "hello there #haskell" should become ["hello", "there", "#haskell"]. I didn't know what to do, in the end chatGPT tutored
2022-12-15 21:35:55 +0100 <voidzero> me, but am i supposed to know this? the recursing stuff is a bit hard to get a hold of.
2022-12-15 21:36:09 +0100waleee(~waleee@h-176-10-137-138.NA.cust.bahnhof.se) (Ping timeout: 260 seconds)
2022-12-15 21:36:36 +0100 <monochrom> Wait chatGPT understands recursion better than my students?! XD
2022-12-15 21:36:45 +0100waleee(~waleee@2001:9b0:213:7200:cc36:a556:b1e8:b340)
2022-12-15 21:36:48 +0100 <monochrom> I need to tell my students and ruin their day.
2022-12-15 21:37:37 +0100 <monochrom> Next office hour: <Student> Hi professor how do you use recursion for Assignment 1? <Professor> You know, chatGPT solved the assignment XD
2022-12-15 21:38:02 +0100 <voidzero> haha yeah well at least chatGPT won't get annoyed if I keep replying "eli5"
2022-12-15 21:38:29 +0100 <voidzero> plus, i've never had any normal schooling, kind of a weird history, so i'm already happy with what i am getting
2022-12-15 21:38:34 +0100 <voidzero> but this -- myLines [] = [] ; myLines ('\n':xs) = myLines xs ; myLines xs = takeWhile (/='\n') xs : myLines (dropWhile (/='\n') xs)
2022-12-15 21:38:48 +0100 <voidzero> I'd never have figured that out on my own
2022-12-15 21:38:54 +0100 <voidzero> not now at least
2022-12-15 21:38:55 +0100lortabac(~lortabac@2a01:e0a:541:b8f0:7798:b400:fd36:b817) (Quit: WeeChat 2.8)
2022-12-15 21:39:50 +0100 <monochrom> Here is a possibility. If that spoiler enlightens you so that you can solve other problems on your own, then the learning objective is achieved.
2022-12-15 21:41:01 +0100 <voidzero> fair enough. It probably will help me solve similar tasks or at the very least I can fall back on this. Maybe I'll just have to learn concrete patterns first and the intuition will come much later.
2022-12-15 21:41:06 +0100 <voidzero> kind of like driving lessons
2022-12-15 21:41:12 +0100 <monochrom> There are a ton of techniques I didn't and couldn't think up on my own. The important thing is after I saw my profs did those tricks I can do it in the future and also teach my students.
2022-12-15 21:41:17 +0100 <voidzero> my first 15 lessons I looked at the mirror, not in the mirror
2022-12-15 21:41:26 +0100bilegeek(~bilegeek@2600:1008:b015:7e38:b69d:8e53:dae7:9c4c)
2022-12-15 21:41:55 +0100 <voidzero> righto. Thanks for that bit of reassurance. : )
2022-12-15 21:41:58 +0100 <monochrom> And by induction, I bet my profs didn't invent those tricks themselves either, they too saw it from their profs...
2022-12-15 21:43:16 +0100 <monochrom> Here is my course notes teaching how to think up recursive algorithms: http://www.cs.utoronto.ca/~trebla/CSCC24-2022-Summer/01-haskell-basic.html#syn
2022-12-15 21:44:11 +0100guest1010(~guest1010@2001:1c06:2715:c200:9a50:5735:4659:120b)
2022-12-15 21:46:10 +0100 <voidzero> oh that's something to chew on, thanks!
2022-12-15 21:48:08 +0100 <voidzero> what does WTP stand for?
2022-12-15 21:48:29 +0100gnalzo(~gnalzo@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c)
2022-12-15 21:49:09 +0100NoOne(~NoOne@181.95.93.87) (Quit: Client closed)
2022-12-15 21:51:14 +0100 <guest1010> Hello, I'm having some difficulty understanding this concept in Haskell. Why does the type of this function, "g :: (a -> b -> c) -> (f a -> f b -> f c)" only allow you to pattern match on the parameters (a -> b -> c), f a, and f b (e.g. g fn fa fb = ...) and not allow you to pattern match on specific values in the the function parameter (a -> b ->
2022-12-15 21:51:14 +0100 <guest1010> c) ? I believe I understand the concepts of currying and associativity; but this seems like some funk combination of both and I cant wrap my head around it.
2022-12-15 21:51:49 +0100zeenk(~zeenk@2a02:2f04:a30d:4300::7fe) (Quit: Konversation terminated!)
2022-12-15 21:52:06 +0100waleee(~waleee@2001:9b0:213:7200:cc36:a556:b1e8:b340) (Quit: WeeChat 3.7.1)
2022-12-15 21:53:18 +0100 <unit73e> guest1010, I didn't get a clear picture. so the first argument is a function that takes a and returns b -> c, but notice that it's (a -> b -> c) so you have to give the entire thing.
2022-12-15 21:53:22 +0100 <unit73e> that part is clear, right?
2022-12-15 21:53:43 +0100gnalzo(~gnalzo@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c) (Quit: WeeChat 3.7.1)
2022-12-15 21:53:58 +0100gnalzo(~gnalzo@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c)
2022-12-15 21:54:26 +0100 <unit73e> and then that returns (f a -> f b -> f c), so basically you're applying f to all arguments of the first.. argument.. for lack of a better term
2022-12-15 21:54:31 +0100 <unit73e> what were you expecting to happen?
2022-12-15 21:54:37 +0100waleee(~waleee@2001:9b0:213:7200:cc36:a556:b1e8:b340)
2022-12-15 21:54:55 +0100 <guest1010> Yeah so hypothetically, I can pass a lambda function like this (\x y -> x + y) as a valid argument (assuming the constraint that a, b, c are Nums)
2022-12-15 21:55:17 +0100Topsi(~Topsi@dyndsl-095-033-225-198.ewe-ip-backbone.de) (Ping timeout: 256 seconds)
2022-12-15 21:56:26 +0100Topsi(~Topsi@dyndsl-095-033-225-198.ewe-ip-backbone.de)
2022-12-15 21:57:09 +0100 <guest1010> My question is more so, how does pattern matching on that function type allow you to extract the function parameter, the first kind, and the second kind. Shouldnt pattern matching allow us to extract the values out of (a -> b -> c) then as well?
2022-12-15 21:57:34 +0100 <guest1010> If we can pattern match fa and fb out of (f a -> f b -> f c), why cant we do that to (a -> b -> c)?
2022-12-15 21:57:52 +0100 <geekosaur> what values?
2022-12-15 21:58:10 +0100 <geekosaur> what values are in (\x y -> x + y)?
2022-12-15 21:58:33 +0100 <geekosaur> you can only give it values, there are none to take out
2022-12-15 21:58:37 +0100 <guest1010> I would counter that by asking what values are in (f a -> f b -> f c)
2022-12-15 21:58:56 +0100 <unit73e> ok now it's a bit more clear
2022-12-15 21:59:06 +0100 <guest1010> but nevertheless we can pattern match to extract those values right?
2022-12-15 21:59:54 +0100 <geekosaur> actually no. we can work on an application of it, but by itself it's just a function like (a -> b -> c) is
2022-12-15 21:59:58 +0100 <guest1010> Take the function  G :: (a -> b -> c) -> (f a -> f b -> f c). You can define a definition for G to be G fn = ...
2022-12-15 22:00:05 +0100phma(~phma@host-67-44-208-17.hnremote.net) (Read error: Connection reset by peer)
2022-12-15 22:00:06 +0100 <geekosaur> do not confuse a function with an application of a function
2022-12-15 22:00:59 +0100phma(phma@2001:5b0:211f:2488:eec1:974f:5902:6cf5)
2022-12-15 22:01:19 +0100 <geekosaur> also, you may be missing the piece where there is a constraint `Functor f`, which means that the type provides a specific way to do that. if the type does not provide that way, it can't be done
2022-12-15 22:02:12 +0100 <guest1010> "we can work on an application of it, but by itself it's just a function like (a -> b -> c) is" fine but then why can't I define an application of (a -> b -> c) too ?
2022-12-15 22:02:51 +0100 <unit73e> you can pattern the entire thing and call it
2022-12-15 22:02:58 +0100 <unit73e> pattern match
2022-12-15 22:03:07 +0100 <geekosaur> but, do you have something to pass it?
2022-12-15 22:03:09 +0100 <mauke> voidzero: it's math jargon. "want to prove", apparently
2022-12-15 22:03:20 +0100 <voidzero> ah i see, thanks
2022-12-15 22:03:26 +0100 <geekosaur> if all you know is (a -> b -> c), you don't know what to supply for a and b
2022-12-15 22:03:43 +0100 <guest1010> So we can define G to be {: G fn = ....,    G fn fa = ...., G fn fa fb = ...., :} but why cant I define G a b c fa fb
2022-12-15 22:04:56 +0100 <geekosaur> oh dear, that sounds somewhat confused. you would in that case be supplying two values and a result, and asking the compiler to figure out what function produced it
2022-12-15 22:05:01 +0100 <mauke> guest1010: that's because of currying
2022-12-15 22:06:00 +0100 <mauke> when you have a type like A -> (B -> C -> D), that means you have a function (taking an argument of type A) and returning another function
2022-12-15 22:06:34 +0100 <mauke> you might implement this as f a = \b c -> ... (where a :: A, b :: B, c :: C)
2022-12-15 22:07:16 +0100 <mauke> guest1010: similarly, in your original example of "g :: (a -> b -> c) -> (f a -> f b -> f c)", you could write "g f = \fa fb -> ..."
2022-12-15 22:07:34 +0100 <mauke> (assuming you're familiar with lambda notation for anonymous functions)
2022-12-15 22:08:16 +0100 <mauke> however, because Haskell does automatic currying, when you define a function like "f a b c = ...", it actually means "f = \a -> \b -> \c -> ..."
2022-12-15 22:08:54 +0100money_(~money@216-131-83-77.nyc.as62651.net)
2022-12-15 22:08:55 +0100merijn(~merijn@86-86-29-250.fixed.kpn.net)
2022-12-15 22:09:11 +0100 <mauke> similarly, "g f = \fa fb -> ..." can also be written as "g f = \fa -> \fb -> ..." or "g = \f -> \fa -> \fb -> ..." or "g f fa fb = ..."
2022-12-15 22:09:23 +0100L29Ah(~L29Ah@wikipedia/L29Ah)
2022-12-15 22:09:59 +0100lisbeths(uid135845@id-135845.lymington.irccloud.com)
2022-12-15 22:10:13 +0100 <mauke> it's not that you can pattern match on the parameters of an argument that is another function, it is that (due to currying) you can effectively pattern match on the parameters of your return value
2022-12-15 22:10:17 +0100 <guest1010> right im following... so then couldnt (a -> b -> c) -> (f a -> f b -> f c) be rewritten as a -> (b -> (c -> (f a -> (f b -> f c))
2022-12-15 22:10:18 +0100 <mauke> (assuming you're returning a function)
2022-12-15 22:10:31 +0100 <mauke> not quite
2022-12-15 22:11:08 +0100 <mauke> (a -> b -> c) -> (f a -> f b -> f c) can be fully parenthesized as (f a -> (f b -> f c)) -> (f a -> (f b -> fc))
2022-12-15 22:11:24 +0100 <mauke> er
2022-12-15 22:11:34 +0100 <mauke> (a -> b -> c) -> (f a -> f b -> f c) can be fully parenthesized as (a -> (b -> c)) -> (f a -> (f b -> fc))
2022-12-15 22:11:51 +0100 <mauke> but you can't dissolve parentheses beyond (a -> b -> c) -> f a -> f b -> f c
2022-12-15 22:12:07 +0100 <guest1010> right!! why!
2022-12-15 22:12:25 +0100 <mauke> the syntactic answer is that -> is right associative
2022-12-15 22:12:40 +0100 <mauke> A -> B -> C simply means A -> (B -> C)
2022-12-15 22:13:25 +0100 <mauke> so if you have a function that takes a function as an argument, such as (A -> B) -> C, you can't write that type without parentheses
2022-12-15 22:13:26 +0100merijn(~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 255 seconds)
2022-12-15 22:13:28 +0100oldsk00l(~znc@ec2-3-10-59-201.eu-west-2.compute.amazonaws.com) (Ping timeout: 272 seconds)
2022-12-15 22:13:42 +0100 <guest1010> I follow that bit.. I've been refreshing myself on associativity of operators; and (->) is a right associative operator
2022-12-15 22:14:58 +0100 <guest1010> but then why does the return type of (f a -> f b -> f c) allow you to not use parentheses
2022-12-15 22:15:07 +0100ballast(~ballast@cpe-104-32-238-223.socal.res.rr.com)
2022-12-15 22:15:26 +0100 <ballast> hoogle fails me, is there a function `duplicates :: Ord a => [a] -> Set a` ?
2022-12-15 22:15:46 +0100 <mauke> guest1010: still because -> is right associative
2022-12-15 22:15:56 +0100 <ballast> i would accept `duplicates :: Ord a => [a] -> [a]` too although i'd prefer something not n^2
2022-12-15 22:16:10 +0100 <Rembane> :t nub -- ballast
2022-12-15 22:16:11 +0100 <lambdabot> Eq a => [a] -> [a]
2022-12-15 22:16:29 +0100 <Rembane> ballast: Or wait, is it the opposite to nub you're searching for?
2022-12-15 22:16:32 +0100 <ballast> sorry, i want the opposite of nub
2022-12-15 22:16:39 +0100 <Rembane> Ha! :D
2022-12-15 22:17:09 +0100 <ballast> although i could probably just do `as \\ nub as`
2022-12-15 22:17:30 +0100 <Rembane> Yeah
2022-12-15 22:17:48 +0100 <mauke> (A -> B) -> C is the type of a function that takes another function as an argument (and returns a value of type C); A -> (B -> C) is the type of a function that returns another function (and takes a value of type A as argument)
2022-12-15 22:18:01 +0100 <ballast> B) lol
2022-12-15 22:18:17 +0100 <Rembane> ballast: Make do with that until things become horribly inefficient, then you can use sort and group and map and when that becomes too slow you can use Set instead. :)
2022-12-15 22:18:23 +0100 <mauke> the latter case is much more common in Haskell (because of currying), so -> was made right associative to let you write simply A -> B -> C
2022-12-15 22:19:33 +0100 <mauke> this extends to multiple chained arrows: A -> (B -> C -> D) means the same thing as A -> (B -> (C -> D)) or, going in the other direction, A -> B -> C -> D
2022-12-15 22:19:50 +0100FinnElija(~finn_elij@user/finn-elija/x-0085643) (Ping timeout: 255 seconds)
2022-12-15 22:20:14 +0100 <ballast> Rembane: yeah i was originally thinking i'd use Set but tbh i doubt n will be much greater than 100
2022-12-15 22:21:51 +0100 <Rembane> ballast: Then I doubt the chosen solution will matter at all. :)
2022-12-15 22:22:02 +0100FinnElija(~finn_elij@user/finn-elija/x-0085643)
2022-12-15 22:22:18 +0100 <ballast> last thing i want to do is union a bunch of Sets containing 3 elements each
2022-12-15 22:22:31 +0100 <ballast> although probably not the worst thing in the world to do
2022-12-15 22:23:50 +0100money_(~money@216-131-83-77.nyc.as62651.net) (Quit: late)
2022-12-15 22:27:06 +0100money_(~money@216-131-83-77.nyc.as62651.net)
2022-12-15 22:29:20 +0100money_(~money@216-131-83-77.nyc.as62651.net) (Read error: Connection reset by peer)
2022-12-15 22:29:42 +0100money_(~money@216-131-83-77.nyc.as62651.net)
2022-12-15 22:29:58 +0100crazazy(~user@130.89.173.127)
2022-12-15 22:32:47 +0100guest1010(~guest1010@2001:1c06:2715:c200:9a50:5735:4659:120b) (Quit: Client closed)
2022-12-15 22:33:54 +0100thyriaen(~thyriaen@2a01:aea0:dd4:4bae:6245:cbff:fe9f:48b1) (Ping timeout: 265 seconds)
2022-12-15 22:34:58 +0100takuan(~takuan@178-116-218-225.access.telenet.be) (Remote host closed the connection)
2022-12-15 22:36:26 +0100biberu(~biberu@user/biberu) (Read error: Connection reset by peer)
2022-12-15 22:38:12 +0100bgs(~bgs@212-85-160-171.dynamic.telemach.net) (Remote host closed the connection)
2022-12-15 22:38:20 +0100tcard(~tcard@2400:4051:5801:7500:cf17:befc:ff82:5303) (Remote host closed the connection)
2022-12-15 22:38:33 +0100tcard(~tcard@2400:4051:5801:7500:cf17:befc:ff82:5303)
2022-12-15 22:43:01 +0100trev(~trev@user/trev) (Remote host closed the connection)
2022-12-15 22:43:49 +0100biberu(~biberu@user/biberu)
2022-12-15 22:50:22 +0100money_(~money@216-131-83-77.nyc.as62651.net) (Quit: late)
2022-12-15 22:51:07 +0100danza(~francesco@4.red-79-153-154.dynamicip.rima-tde.net) (Ping timeout: 248 seconds)
2022-12-15 22:54:31 +0100 <monochrom> voidzero: WTP = Want To Prove
2022-12-15 22:54:34 +0100tcard(~tcard@2400:4051:5801:7500:cf17:befc:ff82:5303) (Remote host closed the connection)
2022-12-15 22:55:48 +0100tcard(~tcard@2400:4051:5801:7500:cf17:befc:ff82:5303)
2022-12-15 22:56:37 +0100bilegeek(~bilegeek@2600:1008:b015:7e38:b69d:8e53:dae7:9c4c) (Remote host closed the connection)
2022-12-15 22:57:10 +0100bilegeek(~bilegeek@2600:1008:b015:7e38:b69d:8e53:dae7:9c4c)
2022-12-15 22:59:48 +0100bilegeek_(~bilegeek@2600:1008:b015:7e38:b69d:8e53:dae7:9c4c)
2022-12-15 23:00:04 +0100CiaoSen(~Jura@p200300c95730b6002a3a4dfffe84dbd5.dip0.t-ipconnect.de) (Ping timeout: 252 seconds)
2022-12-15 23:00:29 +0100gnalzo(~gnalzo@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c) (Quit: WeeChat 3.7.1)
2022-12-15 23:00:43 +0100motherfsck(~motherfsc@user/motherfsck) (Ping timeout: 260 seconds)
2022-12-15 23:02:30 +0100bilegeek(~bilegeek@2600:1008:b015:7e38:b69d:8e53:dae7:9c4c) (Ping timeout: 255 seconds)
2022-12-15 23:03:53 +0100money_(~money@216-131-83-77.nyc.as62651.net)
2022-12-15 23:10:32 +0100 <ncf> is there any conceivable reason why `let (x, y) = head foo` would get compiled by GHC to something ever so slightly faster than `let (x, y):_ = foo` ?
2022-12-15 23:11:01 +0100chexum(~quassel@gateway/tor-sasl/chexum) (Quit: No Ping reply in 180 seconds.)
2022-12-15 23:11:06 +0100VY2(~user@217.107.126.130) (Ping timeout: 272 seconds)
2022-12-15 23:11:44 +0100troydm(~troydm@host-176-37-124-197.b025.la.net.ua) (Ping timeout: 272 seconds)
2022-12-15 23:11:48 +0100jackhill_jackhill
2022-12-15 23:12:32 +0100 <geekosaur> you're getting into stuff that requires scrutinizing Core and possibly assembly, including the potential for cache or alignment issues that get tricky
2022-12-15 23:12:56 +0100chexum(~quassel@gateway/tor-sasl/chexum)
2022-12-15 23:13:02 +0100danza(~francesco@4.red-79-153-154.dynamicip.rima-tde.net)
2022-12-15 23:13:52 +0100gmg(~user@user/gehmehgeh) (Quit: Leaving)
2022-12-15 23:14:25 +0100 <ncf> okay, that's beyond the range of things i choose to care about :)
2022-12-15 23:15:02 +0100motherfsck(~motherfsc@user/motherfsck)
2022-12-15 23:18:10 +0100ballast(~ballast@cpe-104-32-238-223.socal.res.rr.com) (Quit: Client closed)
2022-12-15 23:18:20 +0100ballast(~ballast@cpe-104-32-238-223.socal.res.rr.com)
2022-12-15 23:18:31 +0100michalz(~michalz@185.246.204.93) (Remote host closed the connection)
2022-12-15 23:24:04 +0100fizbin(~fizbin@user/fizbin) (Ping timeout: 260 seconds)
2022-12-15 23:25:39 +0100crazazy`(~user@130.89.171.62)
2022-12-15 23:27:34 +0100crazazy(~user@130.89.173.127) (Ping timeout: 272 seconds)
2022-12-15 23:28:50 +0100danza(~francesco@4.red-79-153-154.dynamicip.rima-tde.net) (Ping timeout: 272 seconds)
2022-12-15 23:33:39 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
2022-12-15 23:35:12 +0100coot(~coot@213.134.171.3) (Quit: coot)
2022-12-15 23:35:26 +0100azimut(~azimut@gateway/tor-sasl/azimut) (Ping timeout: 255 seconds)
2022-12-15 23:35:38 +0100fizbin(~fizbin@user/fizbin)
2022-12-15 23:37:39 +0100azimut(~azimut@gateway/tor-sasl/azimut)
2022-12-15 23:42:38 +0100bilegeek_(~bilegeek@2600:1008:b015:7e38:b69d:8e53:dae7:9c4c) (Remote host closed the connection)
2022-12-15 23:43:03 +0100bilegeek_(~bilegeek@2600:1008:b015:7e38:b69d:8e53:dae7:9c4c)
2022-12-15 23:43:44 +0100ballast(~ballast@cpe-104-32-238-223.socal.res.rr.com) (Quit: Client closed)
2022-12-15 23:48:14 +0100Xeroine(~Xeroine@user/xeroine) (Ping timeout: 252 seconds)
2022-12-15 23:49:05 +0100gabriel_sevecek(~gabriel@188-167-229-200.dynamic.chello.sk) (Ping timeout: 252 seconds)
2022-12-15 23:50:19 +0100money_(~money@216-131-83-77.nyc.as62651.net) (Ping timeout: 256 seconds)
2022-12-15 23:51:23 +0100Xeroine(~Xeroine@user/xeroine)
2022-12-15 23:55:00 +0100 <sclv> oh btw let me ask, my friends are doing some digging into code bootcamps and people's experiences -- if they feel they have been worthwhile, or have been cheated by them, etc. did anyone go to a bootcamp, or have friends who did and would be willing to share anything about it?