2023/03/16

2023-03-16 00:00:29 +0100_ht(~Thunderbi@28-52-174-82.ftth.glasoperator.nl) (Quit: _ht)
2023-03-16 00:02:33 +0100Square(~Square4@user/square) (Remote host closed the connection)
2023-03-16 00:02:48 +0100Square2(~Square4@user/square)
2023-03-16 00:03:38 +0100Tuplanolla(~Tuplanoll@91-159-68-152.elisa-laajakaista.fi) (Quit: Leaving.)
2023-03-16 00:08:13 +0100segfaultfizzbuzz(~segfaultf@108.211.201.53) (Ping timeout: 246 seconds)
2023-03-16 00:16:39 +0100motherfsck(~motherfsc@user/motherfsck) (Ping timeout: 260 seconds)
2023-03-16 00:23:22 +0100merijn(~merijn@86-86-29-250.fixed.kpn.net)
2023-03-16 00:25:33 +0100gurkenglas(~gurkengla@dynamic-046-114-182-147.46.114.pool.telefonica.de) (Ping timeout: 250 seconds)
2023-03-16 00:39:06 +0100segfaultfizzbuzz(~segfaultf@108.211.201.53)
2023-03-16 00:44:13 +0100bhall(~brunohall@195.147.207.136) (Ping timeout: 276 seconds)
2023-03-16 00:44:44 +0100bhall(~brunohall@195.147.207.136)
2023-03-16 00:44:55 +0100segfaultfizzbuzz(~segfaultf@108.211.201.53) (Ping timeout: 265 seconds)
2023-03-16 00:52:33 +0100opticblast(~Thunderbi@172.58.84.141)
2023-03-16 00:54:26 +0100caryhartline(~caryhartl@cpe-76-184-32-233.tx.res.rr.com) (Remote host closed the connection)
2023-03-16 00:56:47 +0100merijn(~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 246 seconds)
2023-03-16 00:57:36 +0100opticblast(~Thunderbi@172.58.84.141) (Quit: opticblast)
2023-03-16 00:58:22 +0100segfaultfizzbuzz(~segfaultf@108.211.201.53)
2023-03-16 01:02:35 +0100freeside(~mengwong@103.252.202.85)
2023-03-16 01:07:15 +0100freeside(~mengwong@103.252.202.85) (Ping timeout: 255 seconds)
2023-03-16 01:07:37 +0100ryanbooker(uid4340@id-4340.hampstead.irccloud.com)
2023-03-16 01:10:52 +0100azimut(~azimut@gateway/tor-sasl/azimut)
2023-03-16 01:14:49 +0100segfaultfizzbuzz(~segfaultf@108.211.201.53) (Ping timeout: 256 seconds)
2023-03-16 01:16:25 +0100Midjak(~Midjak@82.66.147.146) (Quit: Leaving)
2023-03-16 01:16:25 +0100wroathe(~wroathe@207-153-38-140.fttp.usinternet.com)
2023-03-16 01:16:25 +0100wroathe(~wroathe@207-153-38-140.fttp.usinternet.com) (Changing host)
2023-03-16 01:16:25 +0100wroathe(~wroathe@user/wroathe)
2023-03-16 01:17:32 +0100Square2(~Square4@user/square) (Ping timeout: 268 seconds)
2023-03-16 01:18:46 +0100irrgit(~irrgit@146.70.27.242) (Ping timeout: 268 seconds)
2023-03-16 01:24:55 +0100mmhat(~mmh@p200300f1c715f77cee086bfffe095315.dip0.t-ipconnect.de) (Ping timeout: 250 seconds)
2023-03-16 01:25:18 +0100mmhat(~mmh@p200300f1c715f72bee086bfffe095315.dip0.t-ipconnect.de)
2023-03-16 01:25:33 +0100thegeekinside(~thegeekin@189.217.80.156) (Read error: Connection reset by peer)
2023-03-16 01:26:36 +0100thegeekinside(~thegeekin@189.217.80.156)
2023-03-16 01:34:51 +0100masterbuilder(~masterbui@user/masterbuilder) (Ping timeout: 248 seconds)
2023-03-16 01:36:53 +0100masterbuilder(~masterbui@user/masterbuilder)
2023-03-16 01:44:16 +0100segfaultfizzbuzz(~segfaultf@108.211.201.53)
2023-03-16 01:48:59 +0100segfaultfizzbuzz(~segfaultf@108.211.201.53) (Ping timeout: 268 seconds)
2023-03-16 01:50:50 +0100vglfr(~vglfr@37.73.89.236) (Ping timeout: 268 seconds)
2023-03-16 01:54:29 +0100mauke_(~mauke@user/mauke)
2023-03-16 01:55:51 +0100irrgit_(~irrgit@89.47.234.74)
2023-03-16 01:56:22 +0100mauke(~mauke@user/mauke) (Ping timeout: 276 seconds)
2023-03-16 01:56:22 +0100mauke_mauke
2023-03-16 01:56:50 +0100irrgit__(~irrgit@176.113.74.130)
2023-03-16 02:00:27 +0100irrgit_(~irrgit@89.47.234.74) (Ping timeout: 250 seconds)
2023-03-16 02:03:05 +0100 <jean-paul[m]> What are GHC.Num.Integer.IS, IP, IN? https://gist.github.com/exarkun/db734e5bb8bf6a4ddbf12549aa61f389
2023-03-16 02:08:58 +0100machinedgod(~machinedg@d198-53-218-113.abhsia.telus.net) (Ping timeout: 246 seconds)
2023-03-16 02:09:32 +0100 <c_wraith> that message makes no sense given that definition.
2023-03-16 02:10:17 +0100caryhartline(~caryhartl@cpe-76-184-32-233.tx.res.rr.com)
2023-03-16 02:10:19 +0100albet70(~xxx@2400:8902::f03c:92ff:fe60:98d8) (Remote host closed the connection)
2023-03-16 02:10:43 +0100 <c_wraith> the definition isn't matching constructors - it uses a wildcard match. So it's impossible for there to be constructors it's not matching
2023-03-16 02:11:44 +0100 <jean-paul[m]> glad it's not just me, I guess
2023-03-16 02:12:37 +0100 <jean-paul[m]> maybe I shouldn't use ghc 9.0.2
2023-03-16 02:13:04 +0100 <c_wraith> as far as what those constructors are - they represent different cases of arbitrary-sized integers. But that's very internal stuff that you shouldn't need to know unless you're intentionally messing with the internals
2023-03-16 02:14:13 +0100 <jean-paul[m]> hrm 9.4.0 says the same
2023-03-16 02:14:44 +0100 <jean-paul[m]> the whole source file is "module CollatzConjecture (collatz) where" plus what's in the pastebin
2023-03-16 02:15:01 +0100 <c_wraith> and what are you doing with the file?
2023-03-16 02:15:57 +0100 <jean-paul[m]> stack build w/ this package.yaml - https://gist.github.com/exarkun/db734e5bb8bf6a4ddbf12549aa61f389 (gist updated to add file)
2023-03-16 02:16:23 +0100 <int-e> jean-paul[m]: the constructors are an implementation detail you shouldn't have to worry about. I'd replace `odd n` by `otherwise`.
2023-03-16 02:16:26 +0100albet70(~xxx@2400:8902::f03c:92ff:fe60:98d8)
2023-03-16 02:16:27 +0100ddellacosta(~ddellacos@146.70.171.100)
2023-03-16 02:16:56 +0100 <int-e> (The constructurs are, respectively, for small integers (fitting into a single Int), and positive and negative big integers.
2023-03-16 02:16:59 +0100 <int-e> )
2023-03-16 02:17:40 +0100 <jean-paul[m]> int-e: is the `otherwise` suggestion related to the warning? or just a general tip?
2023-03-16 02:17:44 +0100 <int-e> The compiler doesn't understand that one of the final two guards will always match
2023-03-16 02:18:02 +0100 <c_wraith> it will help with other warnings. not the one you're getting.
2023-03-16 02:18:03 +0100 <int-e> it relates to the warning; with that change, the pattern will be seen as complete
2023-03-16 02:18:28 +0100 <jean-paul[m]> so it sees through the pattern match into the guard cases and decides the guard cases are incomplete
2023-03-16 02:18:29 +0100 <jean-paul[m]> ?
2023-03-16 02:18:44 +0100 <c_wraith> Oh. That case. That seems silly, but yeah, I see.
2023-03-16 02:18:58 +0100 <jean-paul[m]> (but if it is so smart why can't it say "guard cases incomplete" instead of "pattern matches non-exhaustive")
2023-03-16 02:19:15 +0100 <c_wraith> It's not able to determine the pattern matches are complete, so it lists all the *constructors* that potentially won't be matched.
2023-03-16 02:19:19 +0100 <int-e> No, the reason here is that it's not smart.
2023-03-16 02:19:38 +0100 <int-e> So it assumes that there are cases where all the guards fail, and then you still have to match the argument.
2023-03-16 02:19:50 +0100 <int-e> And it just lists all the constructors that the type happens to have.
2023-03-16 02:20:08 +0100 <int-e> ...as c_wraith just said as well.
2023-03-16 02:21:06 +0100 <c_wraith> I totally underestimated how weird that warning could get in that case
2023-03-16 02:21:41 +0100 <jean-paul[m]> oh. hmm. so in general, if a case of a pattern match uses a guard that doesn't match a later pattern gets a chance at it?
2023-03-16 02:21:42 +0100 <jean-paul[m]> I don't think I appreciated that fact.
2023-03-16 02:21:51 +0100 <c_wraith> yes, that's true.
2023-03-16 02:22:07 +0100 <c_wraith> patterns and guards are checked top to bottom, with fall-through
2023-03-16 02:22:30 +0100 <int-e> > let f n | odd n = "odd"; f 0 = "zero"; f n = "anything else" in map f [-2..2]
2023-03-16 02:22:30 +0100 <jean-paul[m]> great, learned something. thank you :)
2023-03-16 02:22:32 +0100 <lambdabot> ["anything else","odd","zero","odd","anything else"]
2023-03-16 02:30:38 +0100caryhartline(~caryhartl@cpe-76-184-32-233.tx.res.rr.com) (Quit: caryhartline)
2023-03-16 02:33:28 +0100segfaultfizzbuzz(~segfaultf@108.211.201.53)
2023-03-16 02:33:47 +0100razetime(~Thunderbi@117.193.7.63)
2023-03-16 02:37:43 +0100segfaultfizzbuzz(~segfaultf@108.211.201.53) (Ping timeout: 250 seconds)
2023-03-16 02:51:39 +0100mei(~mei@user/mei) (Ping timeout: 255 seconds)
2023-03-16 02:52:51 +0100merijn(~merijn@86-86-29-250.fixed.kpn.net)
2023-03-16 02:55:43 +0100mei(~mei@user/mei)
2023-03-16 03:00:01 +0100mmhat(~mmh@p200300f1c715f72bee086bfffe095315.dip0.t-ipconnect.de) (Quit: WeeChat 3.8)
2023-03-16 03:00:41 +0100[itchyjunk](~itchyjunk@user/itchyjunk/x-7353470) (Ping timeout: 246 seconds)
2023-03-16 03:02:22 +0100xff0x(~xff0x@ai098135.d.east.v6connect.net) (Ping timeout: 268 seconds)
2023-03-16 03:03:19 +0100freeside(~mengwong@103.252.202.85)
2023-03-16 03:05:55 +0100[itchyjunk](~itchyjunk@user/itchyjunk/x-7353470)
2023-03-16 03:08:35 +0100Fischmiep(~Fischmiep@user/Fischmiep) (Ping timeout: 264 seconds)
2023-03-16 03:09:10 +0100freeside(~mengwong@103.252.202.85) (Ping timeout: 276 seconds)
2023-03-16 03:11:48 +0100Fischmiep(~Fischmiep@user/Fischmiep)
2023-03-16 03:14:06 +0100adanwan_(~adanwan@gateway/tor-sasl/adanwan) (Remote host closed the connection)
2023-03-16 03:14:06 +0100ec(~ec@gateway/tor-sasl/ec) (Remote host closed the connection)
2023-03-16 03:14:07 +0100azimut(~azimut@gateway/tor-sasl/azimut) (Remote host closed the connection)
2023-03-16 03:14:22 +0100adanwan(~adanwan@gateway/tor-sasl/adanwan)
2023-03-16 03:14:33 +0100azimut(~azimut@gateway/tor-sasl/azimut)
2023-03-16 03:14:38 +0100ec(~ec@gateway/tor-sasl/ec)
2023-03-16 03:16:45 +0100segfaultfizzbuzz(~segfaultf@108.211.201.53)
2023-03-16 03:19:07 +0100slack1256(~slack1256@186.11.43.166)
2023-03-16 03:21:31 +0100segfaultfizzbuzz(~segfaultf@108.211.201.53) (Ping timeout: 276 seconds)
2023-03-16 03:21:58 +0100ddellacosta(~ddellacos@146.70.171.100) (Quit: WeeChat 3.8)
2023-03-16 03:25:39 +0100ddellacosta(~ddellacos@146.70.165.203)
2023-03-16 03:28:01 +0100merijn(~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 276 seconds)
2023-03-16 03:29:17 +0100Lord_of_Life(~Lord@user/lord-of-life/x-2819915) (Ping timeout: 250 seconds)
2023-03-16 03:29:23 +0100Lord_of_Life_(~Lord@user/lord-of-life/x-2819915)
2023-03-16 03:30:39 +0100Lord_of_Life_Lord_of_Life
2023-03-16 03:32:50 +0100freeside(~mengwong@103.252.202.85)
2023-03-16 03:35:17 +0100chexum(~quassel@gateway/tor-sasl/chexum) (Ping timeout: 255 seconds)
2023-03-16 03:38:49 +0100azimut(~azimut@gateway/tor-sasl/azimut) (Remote host closed the connection)
2023-03-16 03:39:10 +0100azimut(~azimut@gateway/tor-sasl/azimut)
2023-03-16 03:41:13 +0100freeside(~mengwong@103.252.202.85) (Ping timeout: 268 seconds)
2023-03-16 03:45:09 +0100xff0x(~xff0x@125x103x176x34.ap125.ftth.ucom.ne.jp)
2023-03-16 03:46:32 +0100AlexZenon(~alzenon@178.34.160.55) (Ping timeout: 246 seconds)
2023-03-16 03:47:31 +0100Alex_test(~al_test@178.34.160.55) (Ping timeout: 276 seconds)
2023-03-16 03:47:38 +0100freeside(~mengwong@103.252.202.85)
2023-03-16 03:51:31 +0100Alex_test(~al_test@178.34.160.55)
2023-03-16 03:51:54 +0100gehmehgeh(~user@user/gehmehgeh)
2023-03-16 03:52:02 +0100AlexZenon(~alzenon@178.34.160.55)
2023-03-16 03:52:24 +0100freeside(~mengwong@103.252.202.85) (Ping timeout: 255 seconds)
2023-03-16 03:55:32 +0100gmg(~user@user/gehmehgeh) (Ping timeout: 255 seconds)
2023-03-16 03:56:54 +0100wroathe(~wroathe@user/wroathe) (Ping timeout: 255 seconds)
2023-03-16 03:57:25 +0100ryanbooker(uid4340@id-4340.hampstead.irccloud.com) (Quit: Connection closed for inactivity)
2023-03-16 03:58:39 +0100chexum(~quassel@gateway/tor-sasl/chexum)
2023-03-16 04:02:53 +0100jero98772(~jero98772@2800:484:1d80:d8ce:efcc:cbb3:7f2a:6dff) (Remote host closed the connection)
2023-03-16 04:04:16 +0100 <EvanR> imagine a bug where even n is False and odd n is also False xD
2023-03-16 04:04:38 +0100 <EvanR> it would take days to track down
2023-03-16 04:06:24 +0100segfaultfizzbuzz(~segfaultf@108.211.201.53)
2023-03-16 04:08:46 +0100freeside(~mengwong@103.252.202.85)
2023-03-16 04:10:49 +0100segfaultfizzbuzz(~segfaultf@108.211.201.53) (Ping timeout: 268 seconds)
2023-03-16 04:12:37 +0100gastus_(~gastus@5.83.191.17)
2023-03-16 04:14:34 +0100[itchyjunk](~itchyjunk@user/itchyjunk/x-7353470) (Remote host closed the connection)
2023-03-16 04:16:22 +0100gastus(~gastus@5.83.191.9) (Ping timeout: 268 seconds)
2023-03-16 04:16:46 +0100talismanick(~talismani@2601:200:c000:f7a0::5321)
2023-03-16 04:18:13 +0100freeside(~mengwong@103.252.202.85) (Ping timeout: 268 seconds)
2023-03-16 04:21:19 +0100td_(~td@i53870901.versanet.de) (Ping timeout: 276 seconds)
2023-03-16 04:22:24 +0100td_(~td@i53870903.versanet.de)
2023-03-16 04:24:44 +0100raym(~ray@user/raym) (Ping timeout: 246 seconds)
2023-03-16 04:25:20 +0100raym(~ray@user/raym)
2023-03-16 04:29:22 +0100razetime(~Thunderbi@117.193.7.63) (Quit: See You Space Cowboy)
2023-03-16 04:29:52 +0100dibblego(~dibblego@haskell/developer/dibblego) (Ping timeout: 252 seconds)
2023-03-16 04:34:51 +0100dibblego(~dibblego@122-199-1-30.ip4.superloop.au)
2023-03-16 04:34:51 +0100dibblego(~dibblego@122-199-1-30.ip4.superloop.au) (Changing host)
2023-03-16 04:34:51 +0100dibblego(~dibblego@haskell/developer/dibblego)
2023-03-16 04:39:56 +0100segfaultfizzbuzz(~segfaultf@108.211.201.53)
2023-03-16 04:47:45 +0100segfaultfizzbuzz(~segfaultf@108.211.201.53) (Ping timeout: 255 seconds)
2023-03-16 04:51:58 +0100FinnElija(~finn_elij@user/finn-elija/x-0085643) (Killed (NickServ (Forcing logout FinnElija -> finn_elija)))
2023-03-16 04:51:58 +0100finn_elija(~finn_elij@user/finn-elija/x-0085643)
2023-03-16 04:51:58 +0100finn_elijaFinnElija
2023-03-16 04:52:19 +0100bitdex(~bitdex@gateway/tor-sasl/bitdex)
2023-03-16 04:58:40 +0100bhall(~brunohall@195.147.207.136) (Ping timeout: 265 seconds)
2023-03-16 05:17:15 +0100talismanick(~talismani@2601:200:c000:f7a0::5321) (Ping timeout: 248 seconds)
2023-03-16 05:21:45 +0100mbuf(~Shakthi@49.207.178.186)
2023-03-16 05:23:41 +0100merijn(~merijn@86-86-29-250.fixed.kpn.net)
2023-03-16 05:28:15 +0100merijn(~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 255 seconds)
2023-03-16 05:56:04 +0100trev(~trev@user/trev)
2023-03-16 05:56:33 +0100pyook(~pyook@user/puke)
2023-03-16 06:04:16 +0100bitmapper(uid464869@id-464869.lymington.irccloud.com) (Quit: Connection closed for inactivity)
2023-03-16 06:09:29 +0100talismanick(~talismani@2601:200:c000:f7a0::5321)
2023-03-16 06:17:25 +0100slack1256(~slack1256@186.11.43.166) (Ping timeout: 256 seconds)
2023-03-16 06:34:25 +0100freeside(~mengwong@103.252.202.85)
2023-03-16 06:38:47 +0100machinedgod(~machinedg@d198-53-218-113.abhsia.telus.net)
2023-03-16 06:38:57 +0100freeside(~mengwong@103.252.202.85) (Ping timeout: 256 seconds)
2023-03-16 06:46:50 +0100jonathanx(~jonathan@h-176-10-144-60.NA.cust.bahnhof.se) (Remote host closed the connection)
2023-03-16 06:51:38 +0100harveypwca(~harveypwc@2601:246:c180:a570:3828:d8:e523:3f67)
2023-03-16 06:55:31 +0100bgs(~bgs@212-85-160-171.dynamic.telemach.net)
2023-03-16 06:57:19 +0100freeside(~mengwong@103.252.202.85)
2023-03-16 06:58:56 +0100jinsun(~jinsun@user/jinsun)
2023-03-16 07:00:48 +0100shriekingnoise_(~shrieking@186.137.175.87)
2023-03-16 07:00:57 +0100YoungFrog(~youngfrog@2a02:a03f:ca07:f900:9c2d:58ba:f0b6:128f) (Quit: ZNC 1.7.x-git-3-96481995 - https://znc.in)
2023-03-16 07:01:17 +0100YoungFrog(~youngfrog@39.129-180-91.adsl-dyn.isp.belgacom.be)
2023-03-16 07:01:43 +0100shriekingnoise(~shrieking@186.137.175.87) (Ping timeout: 260 seconds)
2023-03-16 07:02:15 +0100freeside(~mengwong@103.252.202.85) (Ping timeout: 268 seconds)
2023-03-16 07:03:14 +0100freeside(~mengwong@103.252.202.85)
2023-03-16 07:08:11 +0100freeside(~mengwong@103.252.202.85) (Ping timeout: 248 seconds)
2023-03-16 07:09:30 +0100freeside(~mengwong@103.252.202.85)
2023-03-16 07:14:03 +0100freeside(~mengwong@103.252.202.85) (Ping timeout: 248 seconds)
2023-03-16 07:17:35 +0100takuan(~takuan@178-116-218-225.access.telenet.be)
2023-03-16 07:24:16 +0100merijn(~merijn@86-86-29-250.fixed.kpn.net)
2023-03-16 07:28:49 +0100bhall(~brunohall@195.147.207.136)
2023-03-16 07:33:36 +0100razetime(~Thunderbi@117.193.7.63)
2023-03-16 07:38:32 +0100freeside(~mengwong@122.11.248.245)
2023-03-16 07:39:38 +0100michalz(~michalz@185.246.207.221)
2023-03-16 07:43:53 +0100acidjnk(~acidjnk@p200300d6e715c492d58ba900f8be2eb5.dip0.t-ipconnect.de)
2023-03-16 07:48:02 +0100thegeekinside(~thegeekin@189.217.80.156) (Read error: Connection reset by peer)
2023-03-16 07:57:45 +0100shriekingnoise_(~shrieking@186.137.175.87) (Ping timeout: 268 seconds)
2023-03-16 07:58:32 +0100merijn(~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 246 seconds)
2023-03-16 07:59:15 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
2023-03-16 08:01:26 +0100eggplantade(~Eggplanta@2600:1700:38c5:d800:19aa:397c:29a:40e4) (Remote host closed the connection)
2023-03-16 08:09:35 +0100Midjak(~Midjak@82.66.147.146)
2023-03-16 08:10:51 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
2023-03-16 08:11:43 +0100coot(~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba)
2023-03-16 08:12:12 +0100acidjnk(~acidjnk@p200300d6e715c492d58ba900f8be2eb5.dip0.t-ipconnect.de) (Ping timeout: 252 seconds)
2023-03-16 08:21:54 +0100travisb__(~travisb@172-13-49-137.lightspeed.milwwi.sbcglobal.net)
2023-03-16 08:23:35 +0100travisb_(~travisb@172-13-49-137.lightspeed.milwwi.sbcglobal.net) (Ping timeout: 264 seconds)
2023-03-16 08:23:41 +0100Sgeo(~Sgeo@user/sgeo) (Read error: Connection reset by peer)
2023-03-16 08:46:33 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
2023-03-16 08:52:32 +0100coot(~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba) (Quit: coot)
2023-03-16 08:53:49 +0100coot(~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba)
2023-03-16 08:54:07 +0100tzh(~tzh@c-24-21-73-154.hsd1.or.comcast.net) (Quit: zzz)
2023-03-16 08:58:36 +0100_ht(~Thunderbi@28-52-174-82.ftth.glasoperator.nl)
2023-03-16 09:01:53 +0100eggplantade(~Eggplanta@2600:1700:38c5:d800:7045:17e1:cef7:25cd)
2023-03-16 09:05:11 +0100harveypwca(~harveypwc@2601:246:c180:a570:3828:d8:e523:3f67) (Quit: Leaving)
2023-03-16 09:05:31 +0100werneta(~werneta@70-142-214-115.lightspeed.irvnca.sbcglobal.net) (Ping timeout: 248 seconds)
2023-03-16 09:06:03 +0100razetime(~Thunderbi@117.193.7.63) (Ping timeout: 255 seconds)
2023-03-16 09:06:25 +0100eggplantade(~Eggplanta@2600:1700:38c5:d800:7045:17e1:cef7:25cd) (Ping timeout: 250 seconds)
2023-03-16 09:07:15 +0100werneta(~werneta@70-142-214-115.lightspeed.irvnca.sbcglobal.net)
2023-03-16 09:07:21 +0100lortabac(~lortabac@2a01:e0a:541:b8f0:f01a:e318:a715:dc16)
2023-03-16 09:13:09 +0100acidjnk(~acidjnk@p200300d6e715c492d58ba900f8be2eb5.dip0.t-ipconnect.de)
2023-03-16 09:13:35 +0100thyriaen(~thyriaen@2a01:aea0:dd4:5328:6245:cbff:fe9f:48b1)
2023-03-16 09:25:53 +0100razetime(~Thunderbi@117.254.34.235)
2023-03-16 09:25:55 +0100lortabac(~lortabac@2a01:e0a:541:b8f0:f01a:e318:a715:dc16) (Ping timeout: 260 seconds)
2023-03-16 09:33:46 +0100MajorBiscuit(~MajorBisc@2001:1c00:2408:a400:67e:5371:52a7:9b9a)
2023-03-16 09:35:23 +0100chele(~chele@user/chele)
2023-03-16 09:38:04 +0100ccapndave(~ccapndave@xcpe-62-167-164-99.cgn.res.adslplus.ch)
2023-03-16 09:39:12 +0100razetime(~Thunderbi@117.254.34.235) (Quit: See You Space Cowboy)
2023-03-16 09:39:12 +0100EvanR(~EvanR@user/evanr) (Remote host closed the connection)
2023-03-16 09:39:32 +0100EvanR(~EvanR@user/evanr)
2023-03-16 09:42:58 +0100Major_Biscuit(~MajorBisc@c-001-031-036.client.tudelft.eduvpn.nl)
2023-03-16 09:46:27 +0100MajorBiscuit(~MajorBisc@2001:1c00:2408:a400:67e:5371:52a7:9b9a) (Ping timeout: 260 seconds)
2023-03-16 09:47:20 +0100ccapndave(~ccapndave@xcpe-62-167-164-99.cgn.res.adslplus.ch) (Quit: Textual IRC Client: www.textualapp.com)
2023-03-16 09:50:24 +0100pyook(~pyook@user/puke) ()
2023-03-16 10:03:05 +0100ft(~ft@p3e9bc443.dip0.t-ipconnect.de) (Quit: leaving)
2023-03-16 10:06:55 +0100econo(uid147250@user/econo) (Quit: Connection closed for inactivity)
2023-03-16 10:11:01 +0100bhall(~brunohall@195.147.207.136) (Ping timeout: 276 seconds)
2023-03-16 10:13:54 +0100lortabac(~lortabac@2a01:e0a:541:b8f0:3f4e:b1b7:8b56:e5ae)
2023-03-16 10:15:25 +0100bhall(~brunohall@195.147.207.136)
2023-03-16 10:19:45 +0100merijn(~merijn@185.143.104.11)
2023-03-16 10:21:27 +0100CiaoSen(~Jura@p200300c957365a002a3a4dfffe84dbd5.dip0.t-ipconnect.de)
2023-03-16 10:22:47 +0100chexum(~quassel@gateway/tor-sasl/chexum) (Quit: No Ping reply in 180 seconds.)
2023-03-16 10:23:53 +0100chexum(~quassel@gateway/tor-sasl/chexum)
2023-03-16 10:26:19 +0100kuribas(~user@ip-188-118-57-242.reverse.destiny.be)
2023-03-16 10:27:03 +0100talismanick(~talismani@2601:200:c000:f7a0::5321) (Ping timeout: 260 seconds)
2023-03-16 10:32:16 +0100freeside_(~mengwong@202.161.55.11)
2023-03-16 10:34:06 +0100merijn(~merijn@185.143.104.11) (Ping timeout: 265 seconds)
2023-03-16 10:34:43 +0100freeside(~mengwong@122.11.248.245) (Ping timeout: 246 seconds)
2023-03-16 10:34:59 +0100acidjnk(~acidjnk@p200300d6e715c492d58ba900f8be2eb5.dip0.t-ipconnect.de) (Ping timeout: 260 seconds)
2023-03-16 10:38:39 +0100cheater(~Username@user/cheater) (Ping timeout: 256 seconds)
2023-03-16 10:39:11 +0100mmhat(~mmh@p200300f1c715f72bee086bfffe095315.dip0.t-ipconnect.de)
2023-03-16 10:44:05 +0100cheater(~Username@user/cheater)
2023-03-16 10:48:59 +0100coot(~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba) (Quit: coot)
2023-03-16 10:54:22 +0100cheater_(~Username@user/cheater)
2023-03-16 10:54:55 +0100bhall(~brunohall@195.147.207.136) (Read error: Connection reset by peer)
2023-03-16 10:55:18 +0100bhall(brunohall@gateway/vpn/protonvpn/bhall)
2023-03-16 10:56:26 +0100pavonia_(~user@user/siracusa)
2023-03-16 10:56:29 +0100cheater(~Username@user/cheater) (Ping timeout: 250 seconds)
2023-03-16 10:56:35 +0100Fischmiep(~Fischmiep@user/Fischmiep) (Quit: Ping timeout (120 seconds))
2023-03-16 10:56:37 +0100cheater_cheater
2023-03-16 10:57:06 +0100Fischmiep(~Fischmiep@user/Fischmiep)
2023-03-16 10:59:24 +0100tv(~tv@user/tv) (Ping timeout: 252 seconds)
2023-03-16 10:59:31 +0100pavonia(~user@user/siracusa) (Ping timeout: 250 seconds)
2023-03-16 10:59:36 +0100pavonia_pavonia
2023-03-16 11:03:59 +0100eggplantade(~Eggplanta@2600:1700:38c5:d800:7045:17e1:cef7:25cd)
2023-03-16 11:04:08 +0100ubert1(~Thunderbi@2a02:8109:abc0:6434:7f78:da32:9c8a:9bc6)
2023-03-16 11:07:33 +0100xff0x(~xff0x@125x103x176x34.ap125.ftth.ucom.ne.jp) (Ping timeout: 255 seconds)
2023-03-16 11:08:11 +0100eggplantade(~Eggplanta@2600:1700:38c5:d800:7045:17e1:cef7:25cd) (Ping timeout: 248 seconds)
2023-03-16 11:11:44 +0100tv(~tv@user/tv)
2023-03-16 11:18:10 +0100gurkenglas(~gurkengla@dynamic-046-114-182-248.46.114.pool.telefonica.de)
2023-03-16 11:23:08 +0100freeside(~mengwong@122.11.248.245)
2023-03-16 11:24:01 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
2023-03-16 11:25:49 +0100freeside_(~mengwong@202.161.55.11) (Ping timeout: 265 seconds)
2023-03-16 11:28:02 +0100freeside(~mengwong@122.11.248.245) (Ping timeout: 268 seconds)
2023-03-16 11:28:14 +0100freeside(~mengwong@122.11.214.174)
2023-03-16 11:33:19 +0100mncheck(~mncheck@193.224.205.254)
2023-03-16 11:33:54 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
2023-03-16 11:34:58 +0100freeside(~mengwong@122.11.214.174) (Read error: Connection reset by peer)
2023-03-16 11:38:11 +0100L29Ah(~L29Ah@wikipedia/L29Ah) (Read error: Connection reset by peer)
2023-03-16 11:53:35 +0100lortabac(~lortabac@2a01:e0a:541:b8f0:3f4e:b1b7:8b56:e5ae) (Ping timeout: 264 seconds)
2023-03-16 11:59:45 +0100zeenk(~zeenk@2a02:2f04:a307:2300::7fe)
2023-03-16 11:59:48 +0100lortabac(~lortabac@2a01:e0a:541:b8f0:2a8c:2678:6ba3:2f77)
2023-03-16 12:04:19 +0100merijn(~merijn@185.143.104.11)
2023-03-16 12:05:44 +0100dcoutts(~duncan@host86-144-78-144.range86-144.btcentralplus.com)
2023-03-16 12:08:29 +0100merijn(~merijn@185.143.104.11) (Ping timeout: 246 seconds)
2023-03-16 12:11:51 +0100cheater_(~Username@user/cheater)
2023-03-16 12:12:14 +0100xff0x(~xff0x@ai098135.d.east.v6connect.net)
2023-03-16 12:14:25 +0100_xor(~xor@74.215.46.17)
2023-03-16 12:14:30 +0100acidjnk(~acidjnk@p200300d6e715c492d58ba900f8be2eb5.dip0.t-ipconnect.de)
2023-03-16 12:14:34 +0100cheater(~Username@user/cheater) (Ping timeout: 252 seconds)
2023-03-16 12:14:36 +0100cheater_cheater
2023-03-16 12:20:11 +0100lortabac(~lortabac@2a01:e0a:541:b8f0:2a8c:2678:6ba3:2f77) (Ping timeout: 248 seconds)
2023-03-16 12:23:17 +0100freeside(~mengwong@122.11.248.245)
2023-03-16 12:27:55 +0100freeside(~mengwong@122.11.248.245) (Ping timeout: 250 seconds)
2023-03-16 12:42:27 +0100Square2(~Square4@user/square)
2023-03-16 12:43:41 +0100bitdex(~bitdex@gateway/tor-sasl/bitdex) (Quit: = "")
2023-03-16 12:47:18 +0100lortabac(~lortabac@2a01:e0a:541:b8f0:4df1:b4ff:90fe:9e78)
2023-03-16 12:53:21 +0100Square2(~Square4@user/square) (Quit: Leaving)
2023-03-16 12:53:51 +0100Square2(~Square4@user/square)
2023-03-16 12:57:06 +0100freeside(~mengwong@122.11.248.245)
2023-03-16 12:59:44 +0100Square2Square
2023-03-16 13:01:11 +0100pavonia(~user@user/siracusa) (Quit: Bye!)
2023-03-16 13:01:58 +0100freeside(~mengwong@122.11.248.245) (Ping timeout: 276 seconds)
2023-03-16 13:09:47 +0100coot(~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba)
2023-03-16 13:12:45 +0100merijn(~merijn@185.143.104.11)
2023-03-16 13:12:54 +0100wootehfoot(~wootehfoo@user/wootehfoot)
2023-03-16 13:16:02 +0100 <mesaoptimizer2> note to self, I still have to make an issue re HLS eglot :config bug
2023-03-16 13:21:59 +0100cheater_(~Username@user/cheater)
2023-03-16 13:23:17 +0100cheater__(~Username@user/cheater)
2023-03-16 13:23:27 +0100cheater(~Username@user/cheater) (Ping timeout: 260 seconds)
2023-03-16 13:23:32 +0100cheater__cheater
2023-03-16 13:24:41 +0100merijn(~merijn@185.143.104.11) (Ping timeout: 250 seconds)
2023-03-16 13:26:25 +0100cheater_(~Username@user/cheater) (Ping timeout: 250 seconds)
2023-03-16 13:27:23 +0100merijn(~merijn@185.143.104.11)
2023-03-16 13:28:51 +0100bhall(brunohall@gateway/vpn/protonvpn/bhall) (Ping timeout: 255 seconds)
2023-03-16 13:29:32 +0100ggVGc(~ggVGc@a.lowtech.earth)
2023-03-16 13:32:24 +0100freeside(~mengwong@122.11.248.245)
2023-03-16 13:36:01 +0100CiaoSen(~Jura@p200300c957365a002a3a4dfffe84dbd5.dip0.t-ipconnect.de) (Ping timeout: 256 seconds)
2023-03-16 13:36:48 +0100freeside(~mengwong@122.11.248.245) (Ping timeout: 265 seconds)
2023-03-16 13:41:53 +0100L29Ah(~L29Ah@wikipedia/L29Ah)
2023-03-16 13:42:21 +0100wootehfoot(~wootehfoo@user/wootehfoot) (Read error: Connection reset by peer)
2023-03-16 13:47:29 +0100jmdaemon(~jmdaemon@user/jmdaemon) (Ping timeout: 246 seconds)
2023-03-16 14:00:21 +0100hugo-(znc@verdigris.lysator.liu.se) (Ping timeout: 268 seconds)
2023-03-16 14:06:41 +0100freeside(~mengwong@122.11.248.245)
2023-03-16 14:11:27 +0100freeside(~mengwong@122.11.248.245) (Ping timeout: 268 seconds)
2023-03-16 14:15:09 +0100cheater(~Username@user/cheater) (Ping timeout: 268 seconds)
2023-03-16 14:15:24 +0100cheater(~Username@user/cheater)
2023-03-16 14:19:39 +0100cheater(~Username@user/cheater) (Ping timeout: 256 seconds)
2023-03-16 14:20:23 +0100slack1256(~slack1256@186.11.43.166)
2023-03-16 14:22:29 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
2023-03-16 14:23:42 +0100cheater(~Username@user/cheater)
2023-03-16 14:24:45 +0100hugo-(znc@verdigris.lysator.liu.se)
2023-03-16 14:29:51 +0100freeside(~mengwong@122.11.248.245)
2023-03-16 14:32:23 +0100merijn(~merijn@185.143.104.11) (Ping timeout: 265 seconds)
2023-03-16 14:33:47 +0100merijn(~merijn@185.143.104.11)
2023-03-16 14:34:55 +0100freeside(~mengwong@122.11.248.245) (Ping timeout: 276 seconds)
2023-03-16 14:39:12 +0100bhall(brunohall@gateway/vpn/protonvpn/bhall)
2023-03-16 14:41:07 +0100merijn(~merijn@185.143.104.11) (Ping timeout: 246 seconds)
2023-03-16 14:41:44 +0100acidjnk(~acidjnk@p200300d6e715c492d58ba900f8be2eb5.dip0.t-ipconnect.de) (Ping timeout: 246 seconds)
2023-03-16 14:45:39 +0100wootehfoot(~wootehfoo@user/wootehfoot)
2023-03-16 14:48:04 +0100acidjnk(~acidjnk@p200300d6e715c492f5536687732e5bb6.dip0.t-ipconnect.de)
2023-03-16 14:50:18 +0100wootehfoot(~wootehfoo@user/wootehfoot) (Ping timeout: 255 seconds)
2023-03-16 14:54:28 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
2023-03-16 14:54:45 +0100Guest31(~Guest31@rrcs-74-219-213-86.central.biz.rr.com)
2023-03-16 15:02:02 +0100elkcl(~elkcl@broadband-37-110-27-252.ip.moscow.rt.ru) (Ping timeout: 246 seconds)
2023-03-16 15:03:09 +0100freeside(~mengwong@122.11.248.245)
2023-03-16 15:07:23 +0100freeside(~mengwong@122.11.248.245) (Ping timeout: 250 seconds)
2023-03-16 15:08:12 +0100bitmapper(uid464869@id-464869.lymington.irccloud.com)
2023-03-16 15:08:56 +0100thegeekinside(~thegeekin@189.217.80.156)
2023-03-16 15:09:13 +0100razetime(~Thunderbi@117.254.34.235)
2023-03-16 15:25:50 +0100segfaultfizzbuzz(~segfaultf@108.211.201.53)
2023-03-16 15:27:25 +0100dsrt^(~dsrt@c-24-30-76-89.hsd1.ga.comcast.net) (Remote host closed the connection)
2023-03-16 15:27:35 +0100gurkenglas(~gurkengla@dynamic-046-114-182-248.46.114.pool.telefonica.de) (Ping timeout: 246 seconds)
2023-03-16 15:29:31 +0100thegeekinside(~thegeekin@189.217.80.156) (Read error: Connection reset by peer)
2023-03-16 15:29:54 +0100thegeekinside(~thegeekin@189.217.80.156)
2023-03-16 15:32:58 +0100thegeekinside(~thegeekin@189.217.80.156) (Remote host closed the connection)
2023-03-16 15:33:08 +0100thegeekinside(~thegeekin@189.217.80.156)
2023-03-16 15:37:06 +0100freeside(~mengwong@122.11.248.245)
2023-03-16 15:40:08 +0100CiaoSen(~Jura@p200300c957365a002a3a4dfffe84dbd5.dip0.t-ipconnect.de)
2023-03-16 15:41:35 +0100freeside(~mengwong@122.11.248.245) (Ping timeout: 264 seconds)
2023-03-16 15:42:37 +0100gaff(~gaff@49.207.227.108)
2023-03-16 15:43:28 +0100 <gaff> is there a way to get the complete list of OPTIONS_GHC pragmas from the commandline?
2023-03-16 15:43:54 +0100 <gaff> i need it for configuring omnicompletion in vim
2023-03-16 15:44:15 +0100thegeekinside(~thegeekin@189.217.80.156) (Remote host closed the connection)
2023-03-16 15:45:44 +0100Guest31(~Guest31@rrcs-74-219-213-86.central.biz.rr.com) (Quit: Client closed)
2023-03-16 15:46:12 +0100elkcl(~elkcl@broadband-37-110-27-252.ip.moscow.rt.ru)
2023-03-16 15:47:05 +0100 <gaff> sorry, i meant complete list of OPTIONS_GHC pragmas
2023-03-16 15:49:00 +0100 <geekosaur> `ghc --show-options` ? although it doesn't leave out mode options, but you can distinguish those because they all start with `--`
2023-03-16 15:50:59 +0100 <geekosaur> it also doesn't distinguish dynamic ones but I think at this point they're all either mode options or dynamic ones
2023-03-16 15:51:23 +0100Sgeo(~Sgeo@user/sgeo)
2023-03-16 15:52:24 +0100freeside(~mengwong@122.11.248.245)
2023-03-16 15:52:36 +0100 <geekosaur> single character options being an exception here, so that may be a problem
2023-03-16 15:56:46 +0100freeside(~mengwong@122.11.248.245) (Ping timeout: 252 seconds)
2023-03-16 15:57:26 +0100 <gaff> geekosaur: i ran that command just before you told me. but i noticed things are missing there; for example, -fno-warn-orphans
2023-03-16 15:59:37 +0100y04nn(~username@185.213.154.207)
2023-03-16 15:59:44 +0100 <mauke> "In GHC < 8 the syntax for -W<wflag> was -fwarn-<wflag> (e.g. -fwarn-incomplete-patterns). This spelling is deprecated, but still accepted for backwards compatibility. Likewise, -Wno-<wflag> used to be fno-warn-<wflag> (e.g. -fno-warn-incomplete-patterns)."
2023-03-16 16:00:11 +0100 <mauke> https://downloads.haskell.org/ghc/latest/docs/users_guide/using-warnings.html
2023-03-16 16:01:17 +0100 <gaff> i am runing running ghc 8.10.4
2023-03-16 16:01:55 +0100 <geekosaur> right, so that's a backward compatibility thing
2023-03-16 16:02:06 +0100 <geekosaur> I don't know how that's handled
2023-03-16 16:02:18 +0100mjacob(~mjacob@adrastea.uberspace.de) (Read error: Connection reset by peer)
2023-03-16 16:02:34 +0100 <geekosaur> but the modern spelling is -Wno-orphans
2023-03-16 16:02:38 +0100 <mauke> gaff: so that applies to you
2023-03-16 16:03:40 +0100 <gaff> ah i see. thanks. i used the old -fno-warn-orphans in code and it works ... so i suppose it is the backward compatability thing
2023-03-16 16:05:45 +0100 <gaff> geekosaur: so show-options output cleansed of mode options (the stuff preceeded by --) should work, uh?
2023-03-16 16:06:18 +0100 <geekosaur> and single character options aside from -W/-w, yes
2023-03-16 16:06:55 +0100 <mauke> if you want to see the deprecated forms as well, ghc --show-options | sed '/^-W/ { p; s/^-Wno/-fno-warn/; t; s/^-W/-fwarn-/ }'
2023-03-16 16:06:57 +0100 <geekosaur> hm, actually more complex than that because you'll still get stuff like -odir
2023-03-16 16:07:15 +0100 <gaff> geekosaur: yeah
2023-03-16 16:07:25 +0100eggplantade(~Eggplanta@2600:1700:38c5:d800:7045:17e1:cef7:25cd)
2023-03-16 16:07:36 +0100 <geekosaur> this might be a question for #ghc, there should probably be a way to get this (--show-dynamic-options?)
2023-03-16 16:07:47 +0100 <mauke> (I've been practicing my sed)
2023-03-16 16:07:48 +0100 <geekosaur> completion is pretty pervasive these days
2023-03-16 16:07:50 +0100mjacob(~mjacob@adrastea.uberspace.de)
2023-03-16 16:08:05 +0100 <gaff> so how do you get the stuff that is just for the OPTIONS_GHC pragmas that put as file header?
2023-03-16 16:09:15 +0100 <gaff> mauke: thanks for the sed thing; looks like an easy pattern match substitution
2023-03-16 16:10:37 +0100 <mauke> as a human: https://downloads.haskell.org/ghc/latest/docs/users_guide/flags.html#flag-reference
2023-03-16 16:10:49 +0100 <mauke> "Type: dynamic" are the ones that can be used in files
2023-03-16 16:10:53 +0100 <gaff> i am looking for this stuff as input for some code i am writing for vim omnicompletion
2023-03-16 16:11:12 +0100 <geekosaur> so if you keep asking you'll get a different answer?
2023-03-16 16:11:57 +0100eggplantade(~Eggplanta@2600:1700:38c5:d800:7045:17e1:cef7:25cd) (Ping timeout: 250 seconds)
2023-03-16 16:12:25 +0100freeside(~mengwong@122.11.248.245)
2023-03-16 16:12:32 +0100 <gaff> mauke: hey, thanks. have to manually parse that stuff
2023-03-16 16:13:09 +0100 <gaff> geekosaur: no, sorry for the double prodding ... sometimes i can not remember
2023-03-16 16:17:10 +0100werneta(~werneta@70-142-214-115.lightspeed.irvnca.sbcglobal.net) (Remote host closed the connection)
2023-03-16 16:19:12 +0100 <geekosaur> mrr, does ghcup not install the ghc users guide? (trying to work out an awk expression to pull out dynamic options from that table)
2023-03-16 16:19:27 +0100 <geekosaur> I see libraries but not the guide
2023-03-16 16:22:49 +0100 <gaff> geekosaur: ghcup has the users guide, at least in my case. ~/.ghcup/ghc/8.10.4/share/doc/ghc-8.10.4/html/users_guide/
2023-03-16 16:23:53 +0100 <geekosaur> wonder what that translates to in xdg mode
2023-03-16 16:24:07 +0100 <mauke> no, that only contains a man page here
2023-03-16 16:24:41 +0100 <geekosaur> crud, I have it… for 8.10
2023-03-16 16:24:49 +0100 <geekosaur> not 9.2.5 which I was looking at
2023-03-16 16:24:50 +0100eggplantade(~Eggplanta@2600:1700:38c5:d800:7045:17e1:cef7:25cd)
2023-03-16 16:25:04 +0100 <mauke> oh, I'm dumb
2023-03-16 16:25:18 +0100 <mauke> I was looking in users_guide, not html/users_guide
2023-03-16 16:27:28 +0100 <mauke> heh, class="row-even" ... class="row-odd"
2023-03-16 16:28:50 +0100 <mauke> get with the times, guys! tr:nth-child(even)
2023-03-16 16:29:14 +0100aztex(~aztex@ext-1-370.eduroam.chalmers.se)
2023-03-16 16:29:36 +0100freeside(~mengwong@122.11.248.245) (Ping timeout: 246 seconds)
2023-03-16 16:29:44 +0100 <aztex> I was under the impression that a data type needs to have  a Monad instance for using the do notationg
2023-03-16 16:29:45 +0100 <int-e> . o O ( But will it work in Internet Explorer? ;-) )
2023-03-16 16:30:09 +0100slack1256(~slack1256@186.11.43.166) (Ping timeout: 250 seconds)
2023-03-16 16:30:14 +0100 <aztex> but something like this:
2023-03-16 16:30:14 +0100 <aztex> data Foo
2023-03-16 16:30:15 +0100 <aztex> foo :: Foo
2023-03-16 16:30:15 +0100 <aztex> foo = do
2023-03-16 16:30:16 +0100 <aztex>   baz "baz"
2023-03-16 16:30:19 +0100 <aztex> seems to compile fine
2023-03-16 16:30:34 +0100 <aztex> what does the compiler interpret the `do` notation in this program
2023-03-16 16:30:47 +0100 <aztex> Foo is clearly not defined as a Monad
2023-03-16 16:31:56 +0100 <int-e> @undo do baz "baz"
2023-03-16 16:31:56 +0100 <lambdabot> baz "baz"
2023-03-16 16:33:06 +0100 <mauke> aztex: the desugaring of multiple lines/"statements" requires Monad
2023-03-16 16:33:08 +0100 <int-e> `do` notation is pure syntactic sugar; it's tied to Monad only if you have more than one non-let statement.
2023-03-16 16:33:28 +0100 <mauke> for a single expression you don't need any extra operations
2023-03-16 16:33:31 +0100 <mauke> or let, yeah
2023-03-16 16:33:39 +0100 <int-e> cf. https://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-470003.14
2023-03-16 16:33:57 +0100shriekingnoise(~shrieking@186.137.175.87)
2023-03-16 16:34:11 +0100 <aztex> ah okay so if I did `baz "baz"` twice it would fail right?
2023-03-16 16:34:17 +0100 <int-e> yes
2023-03-16 16:34:27 +0100cheater_(~Username@user/cheater)
2023-03-16 16:34:27 +0100 <int-e> because then it would desugar to a use of >>
2023-03-16 16:34:41 +0100 <int-e> @undo baz; bar
2023-03-16 16:34:41 +0100 <aztex> phew thats a relief
2023-03-16 16:34:41 +0100 <lambdabot> <unknown>.hs:1:4:Parse error: ;
2023-03-16 16:34:45 +0100 <int-e> @undo do baz; bar
2023-03-16 16:34:46 +0100 <lambdabot> baz >> bar
2023-03-16 16:35:19 +0100 <aztex> I think I had the same intuition as everyone is discussing here but I was shocked when the do notation with one statement worked
2023-03-16 16:36:03 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Read error: Connection reset by peer)
2023-03-16 16:36:20 +0100econo(uid147250@user/econo)
2023-03-16 16:36:25 +0100 <int-e> understandable, but now you know why :)(
2023-03-16 16:36:38 +0100 <aztex> yes thanks :)
2023-03-16 16:37:55 +0100cheater(~Username@user/cheater) (Ping timeout: 256 seconds)
2023-03-16 16:38:31 +0100 <gaff> geekosaur: well, thanks for your help
2023-03-16 16:38:39 +0100 <gaff> mauke: thanks a bunch
2023-03-16 16:39:04 +0100 <geekosaur> I still think you should ask for --show-dynamic-options in #ghc, since completion isn't going away
2023-03-16 16:39:29 +0100 <geekosaur> or file an issue for it (https://gitlab.haskell.org/ghc/ghc/issues)
2023-03-16 16:39:36 +0100merijn(~merijn@185.143.104.11)
2023-03-16 16:39:42 +0100 <gaff> sure. i didn't know about the #ghc channel. hearing it for the first time from you
2023-03-16 16:39:43 +0100cheater_(~Username@user/cheater) (Ping timeout: 276 seconds)
2023-03-16 16:41:30 +0100gaff(~gaff@49.207.227.108) ()
2023-03-16 16:42:44 +0100ddellacosta(~ddellacos@146.70.165.203) (Quit: WeeChat 3.8)
2023-03-16 16:43:48 +0100ddellacosta(~ddellacos@146.70.165.203)
2023-03-16 16:44:29 +0100aztex(~aztex@ext-1-370.eduroam.chalmers.se) (Quit: Client closed)
2023-03-16 16:45:34 +0100razetime(~Thunderbi@117.254.34.235) (Quit: See You Space Cowboy)
2023-03-16 16:51:25 +0100 <EvanR> :t let baz = undefined in do { baz "baz" }
2023-03-16 16:51:26 +0100 <lambdabot> t
2023-03-16 16:51:59 +0100 <EvanR> cool we can use do notation anywhere as long as it's 1 "statement" xD
2023-03-16 16:52:09 +0100 <geekosaur> > do do do do do 1
2023-03-16 16:52:11 +0100 <lambdabot> 1
2023-03-16 16:52:49 +0100 <EvanR> > let please = id in please do "something"
2023-03-16 16:52:50 +0100 <lambdabot> error:
2023-03-16 16:52:50 +0100 <lambdabot> Unexpected do block in function application:
2023-03-16 16:52:50 +0100 <lambdabot> do "something"
2023-03-16 16:53:23 +0100lortabac(~lortabac@2a01:e0a:541:b8f0:4df1:b4ff:90fe:9e78) (Quit: WeeChat 2.8)
2023-03-16 16:53:32 +0100 <geekosaur> need BlockArguments
2023-03-16 16:53:53 +0100 <EvanR> :set -XBlockArguments
2023-03-16 16:54:16 +0100 <geekosaur> @let {-# LANGUAGE BlockArguments #-}
2023-03-16 16:54:18 +0100 <lambdabot> Defined.
2023-03-16 16:54:31 +0100 <geekosaur> > let please = id in please do "something"
2023-03-16 16:54:33 +0100 <lambdabot> error:
2023-03-16 16:54:33 +0100 <lambdabot> Unexpected do block in function application:
2023-03-16 16:54:33 +0100 <lambdabot> do "something"
2023-03-16 16:54:40 +0100 <geekosaur> hm
2023-03-16 16:55:01 +0100 <int-e> :t let monadic :: Monad m => m a -> m a; monadic = id in monadic $ do undefined
2023-03-16 16:55:03 +0100 <lambdabot> Monad m => m a
2023-03-16 16:55:42 +0100dgb83(~dgb@astra4961.startdedicated.net) (Quit: The Lounge - https://thelounge.github.io)
2023-03-16 16:56:17 +0100JamesG(~JamesG@2600:8800:8c84:5d00:9878:b9de:731b:d1c2)
2023-03-16 16:56:38 +0100 <EvanR> intercal's please syntax which if not used often enough results in the program randomly ... not doing something
2023-03-16 16:56:39 +0100 <int-e> geekosaur: lambdabot parses the expression using haskell-src-exts before passing it on to ghc.
2023-03-16 16:56:55 +0100 <geekosaur> hm, right
2023-03-16 16:57:10 +0100 <geekosaur> so that doesn't know BlockArguments yet
2023-03-16 16:57:30 +0100 <int-e> EvanR: hmm, that seems to be a mix of the politeness check and the random compiler error
2023-03-16 16:57:44 +0100freeside(~mengwong@122.11.248.245)
2023-03-16 16:58:26 +0100 <int-e> (you can be either insufficiently and overly polite btw; both checks are deterministic)
2023-03-16 16:58:38 +0100 <EvanR> a linter for intercal which mishaves even worse than the language
2023-03-16 16:58:47 +0100 <int-e> (while the random compiler error non-deterministically introduces a run-time error into your code)
2023-03-16 16:59:14 +0100 <EvanR> it's not random? ok
2023-03-16 16:59:49 +0100 <tdammers> IIRC it's not random, but the correct percentage is undocumented and implementation-specific
2023-03-16 17:00:00 +0100 <dminuoso> There was a simple way to take an arbitrary haskell expression and turn it into a Dec that TH would accept. Any pointers?
2023-03-16 17:00:10 +0100steve[m](~stevetrou@2001:470:69fc:105::e0b) (Quit: You have been kicked for being idle)
2023-03-16 17:00:11 +0100 <dminuoso> (or well, top level declaration rather than expression)
2023-03-16 17:01:09 +0100 <dminuoso> Or do I need ghc-lib for that?
2023-03-16 17:02:28 +0100freeside(~mengwong@122.11.248.245) (Ping timeout: 276 seconds)
2023-03-16 17:02:52 +0100 <dminuoso> % :set -XTemplateHaskell
2023-03-16 17:02:52 +0100 <yahb2> <no output>
2023-03-16 17:02:59 +0100 <dminuoso> % show [d| instance Show Foo |]
2023-03-16 17:02:59 +0100 <yahb2> <interactive>:24:24: error: ; • Not in scope: type constructor or class ‘Foo’ ; • In the Template Haskell quotation [d| instance Show Foo |]
2023-03-16 17:03:04 +0100 <dminuoso> % show [d| instance Show String |]
2023-03-16 17:03:04 +0100 <yahb2> <interactive>:26:1: error: ; • Ambiguous type variable ‘m0’ arising from a use of ‘show’ ; prevents the constraint ‘(Show ; (m0 Language.Haskell.TH.Lib.I...
2023-03-16 17:03:05 +0100 <int-e> dminuoso: just [| e |]... wait, Dec? There's [d| ... |] for DecsQ
2023-03-16 17:03:21 +0100 <dminuoso> % :t [d| instance Show String |]
2023-03-16 17:03:21 +0100 <yahb2> [d| instance Show String |] ; :: Language.Haskell.TH.Syntax.Quote m => ; m Language.Haskell.TH.Lib.Internal.Decs
2023-03-16 17:03:32 +0100 <dminuoso> % show $([d| instance Show String |])
2023-03-16 17:03:32 +0100 <yahb2> <interactive>:30:8: error: ; • Couldn't match type ‘[Language.Haskell.TH.Syntax.Dec]’ ; with ‘Language.Haskell.TH.Syntax.Exp’ ; Expected: Language.Haskell.TH.Lib.Inte...
2023-03-16 17:03:35 +0100 <dminuoso> Oh no mmm
2023-03-16 17:04:00 +0100 <dminuoso> % runQ (liftIO . print $ [d| instance Show String |])
2023-03-16 17:04:01 +0100 <yahb2> <interactive>:32:1: error: Variable not in scope: runQ :: t0 -> t ; ; <interactive>:32:7: error: ; Variable not in scope: liftIO :: IO () -> t0
2023-03-16 17:04:55 +0100chomwitt(~chomwitt@2a02:587:7a19:9200:1ac0:4dff:fedb:a3f1)
2023-03-16 17:05:22 +0100 <int-e> % Language.Haskell.TH.runQ [d| instance Show String |]
2023-03-16 17:05:22 +0100 <yahb2> [InstanceD Nothing [] (AppT (ConT GHC.Show.Show) (ConT GHC.Base.String)) []]
2023-03-16 17:05:27 +0100 <dminuoso> Ah yes.
2023-03-16 17:05:31 +0100 <dminuoso> Cheers.
2023-03-16 17:05:40 +0100 <dminuoso> Hecate: ^-
2023-03-16 17:05:51 +0100int-ewas testing in ghci (hint!)
2023-03-16 17:05:58 +0100segfaultfizzbuzz(~segfaultf@108.211.201.53) (Ping timeout: 268 seconds)
2023-03-16 17:06:23 +0100cheater_(~Username@user/cheater)
2023-03-16 17:06:23 +0100cheater_cheater
2023-03-16 17:13:02 +0100coot(~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba) (Quit: coot)
2023-03-16 17:14:21 +0100segfaultfizzbuzz(~segfaultf@108.211.201.53)
2023-03-16 17:14:27 +0100codaraxis(~codaraxis@user/codaraxis)
2023-03-16 17:16:24 +0100mixfix41(~sdenynine@user/mixfix41)
2023-03-16 17:16:34 +0100Guest31(~Guest31@rrcs-74-219-213-86.central.biz.rr.com)
2023-03-16 17:22:35 +0100mbuf(~Shakthi@49.207.178.186) (Quit: Leaving)
2023-03-16 17:24:34 +0100segfaultfizzbuzz(~segfaultf@108.211.201.53) (Ping timeout: 246 seconds)
2023-03-16 17:25:53 +0100mesaoptimizer2(34cef275bb@user/PapuaHardyNet) (Quit: Gateway shutdown)
2023-03-16 17:26:02 +0100mesaoptimizer2(34cef275bb@198.108.77.94)
2023-03-16 17:26:14 +0100mesaoptimizer2(34cef275bb@198.108.77.94) (Changing host)
2023-03-16 17:26:14 +0100mesaoptimizer2(34cef275bb@user/PapuaHardyNet)
2023-03-16 17:26:43 +0100Guest31(~Guest31@rrcs-74-219-213-86.central.biz.rr.com) (Ping timeout: 260 seconds)
2023-03-16 17:29:50 +0100inversed(~inversed@bcdcac82.skybroadband.com) (Read error: No route to host)
2023-03-16 17:30:46 +0100freeside(~mengwong@122.11.248.245)
2023-03-16 17:34:31 +0100inversed(~inversed@bcdcac82.skybroadband.com)
2023-03-16 17:35:02 +0100freeside(~mengwong@122.11.248.245) (Ping timeout: 246 seconds)
2023-03-16 17:36:42 +0100Guest98(~Guest98@astra4961.startdedicated.net)
2023-03-16 17:36:58 +0100Guest98(~Guest98@astra4961.startdedicated.net) (Client Quit)
2023-03-16 17:40:17 +0100migas(~migas@astra4961.startdedicated.net)
2023-03-16 17:40:32 +0100elkcl(~elkcl@broadband-37-110-27-252.ip.moscow.rt.ru) (Ping timeout: 252 seconds)
2023-03-16 17:46:58 +0100Pickchea(~private@user/pickchea)
2023-03-16 17:50:00 +0100tzh(~tzh@c-24-21-73-154.hsd1.or.comcast.net)
2023-03-16 17:50:21 +0100cheater_(~Username@user/cheater)
2023-03-16 17:52:15 +0100cheater(~Username@user/cheater) (Ping timeout: 260 seconds)
2023-03-16 17:52:25 +0100cheater_cheater
2023-03-16 17:55:04 +0100kuribas(~user@ip-188-118-57-242.reverse.destiny.be) (Ping timeout: 260 seconds)
2023-03-16 17:55:59 +0100CiaoSen(~Jura@p200300c957365a002a3a4dfffe84dbd5.dip0.t-ipconnect.de) (Ping timeout: 264 seconds)
2023-03-16 17:57:02 +0100harveypwca(~harveypwc@2601:246:c180:a570:3828:d8:e523:3f67)
2023-03-16 17:58:02 +0100JamesG(~JamesG@2600:8800:8c84:5d00:9878:b9de:731b:d1c2) (Quit: Client closed)
2023-03-16 17:59:12 +0100freeside(~mengwong@122.11.248.245)
2023-03-16 18:05:40 +0100cheater_(~Username@user/cheater)
2023-03-16 18:07:55 +0100 <Profpatsch> Is there a ghc-lib based quasiquote for haskell code? like the outdated https://hackage.haskell.org/package/haskell-src-exts-qq
2023-03-16 18:08:45 +0100cheater__(~Username@user/cheater)
2023-03-16 18:08:46 +0100cheater(~Username@user/cheater) (Ping timeout: 276 seconds)
2023-03-16 18:08:50 +0100cheater__cheater
2023-03-16 18:09:23 +0100cassiopea(~cassiopea@user/cassiopea)
2023-03-16 18:09:49 +0100cheater_(~Username@user/cheater) (Ping timeout: 250 seconds)
2023-03-16 18:11:18 +0100man_max(~man_max@94-43-231-47.dsl.utg.ge)
2023-03-16 18:11:57 +0100kuribas(~user@ip-188-118-57-242.reverse.destiny.be)
2023-03-16 18:12:02 +0100man_max(~man_max@94-43-231-47.dsl.utg.ge) (Client Quit)
2023-03-16 18:12:05 +0100 <merijn> Profpatsch: Isn't that just the standard TH quasiquoters?
2023-03-16 18:12:42 +0100jmdaemon(~jmdaemon@user/jmdaemon)
2023-03-16 18:12:44 +0100kuribas(~user@ip-188-118-57-242.reverse.destiny.be) (Client Quit)
2023-03-16 18:13:03 +0100hrberg(~quassel@171.79-160-161.customer.lyse.net)
2023-03-16 18:13:29 +0100 <Profpatsch> merijn: you might have a point
2023-03-16 18:13:31 +0100 <Profpatsch> huh
2023-03-16 18:13:42 +0100 <merijn> i.e. [d|, [e| and friends
2023-03-16 18:13:59 +0100 <Profpatsch> that, but I feel like I want to write code to generate haskell files
2023-03-16 18:14:04 +0100 <Profpatsch> not immediately compile it
2023-03-16 18:14:06 +0100 <Profpatsch> but check into git
2023-03-16 18:14:26 +0100 <merijn> Profpatsch: -ddump-splices ;)
2023-03-16 18:14:29 +0100 <Profpatsch> lol
2023-03-16 18:14:50 +0100 <geekosaur> haskell-src-meta?
2023-03-16 18:15:04 +0100 <Hecate> ooooooh
2023-03-16 18:15:05 +0100 <merijn> You can even tell it to dump splices in a separate directory instead of dist-newstyle now (consult GHC user guide for details :p)
2023-03-16 18:15:23 +0100 <Hecate> thank you int-e & dminuoso <3
2023-03-16 18:15:30 +0100 <Profpatsch> merijn: huh
2023-03-16 18:15:34 +0100 <Profpatsch> maybe that’s actually a good idea
2023-03-16 18:15:36 +0100 <Profpatsch> idk
2023-03-16 18:15:50 +0100 <Profpatsch> feels like an idea worth trying
2023-03-16 18:15:52 +0100 <merijn> Profpatsch: there's a dump-directory or something to aggregate all the splices in one place now
2023-03-16 18:16:07 +0100 <merijn> I forget the exact flag, but it's in the user guide somewhere between the dump flags
2023-03-16 18:16:15 +0100 <merijn> Gotta run and pretend to be social now ;)
2023-03-16 18:16:48 +0100 <Profpatsch> geekosaur: idk what that does
2023-03-16 18:16:50 +0100freeside(~mengwong@122.11.248.245) (Ping timeout: 252 seconds)
2023-03-16 18:17:06 +0100 <Profpatsch> but yeah, gotta run as well, train has arrived
2023-03-16 18:17:10 +0100ubert1(~Thunderbi@2a02:8109:abc0:6434:7f78:da32:9c8a:9bc6) (Remote host closed the connection)
2023-03-16 18:17:20 +0100L29Ah(~L29Ah@wikipedia/L29Ah) ()
2023-03-16 18:17:24 +0100harveypwca(~harveypwc@2601:246:c180:a570:3828:d8:e523:3f67) (Quit: Leaving)
2023-03-16 18:17:29 +0100 <geekosaur> primary intent is to use haskell-src-ext to parse Haskell and produce TH ASTs instead of HSE ASTs
2023-03-16 18:18:12 +0100 <geekosaur> but you could presumably dump-splices that, or build your own quasiquoter using HSE
2023-03-16 18:18:16 +0100feliix42_(~felix@gibbs.uberspace.de) (Read error: Connection reset by peer)
2023-03-16 18:21:12 +0100merijn(~merijn@185.143.104.11) (Ping timeout: 264 seconds)
2023-03-16 18:21:25 +0100feliix42(~felix@gibbs.uberspace.de)
2023-03-16 18:25:06 +0100inversed(~inversed@bcdcac82.skybroadband.com) (Read error: Connection reset by peer)
2023-03-16 18:25:33 +0100thyriaen(~thyriaen@2a01:aea0:dd4:5328:6245:cbff:fe9f:48b1) (Quit: Leaving)
2023-03-16 18:25:48 +0100inversed(~inversed@bcdcac82.skybroadband.com)
2023-03-16 18:26:08 +0100inversed(~inversed@bcdcac82.skybroadband.com) (Read error: Connection reset by peer)
2023-03-16 18:26:53 +0100inversed(~inversed@bcdcac82.skybroadband.com)
2023-03-16 18:28:07 +0100freeside(~mengwong@122.11.248.245)
2023-03-16 18:29:53 +0100azimut(~azimut@gateway/tor-sasl/azimut) (Ping timeout: 255 seconds)
2023-03-16 18:30:21 +0100y04nn(~username@185.213.154.207) (Ping timeout: 255 seconds)
2023-03-16 18:31:44 +0100noctux(~noctux@user/noctux) (Read error: Connection reset by peer)
2023-03-16 18:32:13 +0100elkcl(~elkcl@broadband-37-110-27-252.ip.moscow.rt.ru)
2023-03-16 18:32:23 +0100cheater(~Username@user/cheater) (Ping timeout: 260 seconds)
2023-03-16 18:32:52 +0100c_wraith(~c_wraith@adjoint.us) (Ping timeout: 260 seconds)
2023-03-16 18:33:02 +0100c_wraith(~c_wraith@adjoint.us)
2023-03-16 18:33:05 +0100notzmv(~zmv@user/notzmv)
2023-03-16 18:33:11 +0100freeside(~mengwong@122.11.248.245) (Ping timeout: 264 seconds)
2023-03-16 18:34:20 +0100noctux(~noctux@user/noctux)
2023-03-16 18:34:25 +0100Ashkan(~Ashkan@ec2-54-78-14-109.eu-west-1.compute.amazonaws.com)
2023-03-16 18:34:45 +0100 <Ashkan> Hello people:)
2023-03-16 18:34:45 +0100 <Ashkan> Does this make sense https://paste.tomsmeding.com/0fxeAcDL ?
2023-03-16 18:36:18 +0100 <monochrom> You can answer these kinds of questions ("I have thought up an abstraction. Does it make sense?") by providing both of the following:
2023-03-16 18:36:55 +0100 <Ashkan> Idea is to give fine-grain control over how a game would interact with the input/output. A turn-based game can not progress unless some input is provided. The type class is meant to somewhat enforce that (by *not* providing a non-blocking input reading method). Real-time game is somewhat opposite : the game can progress on its own so a non-blocking
2023-03-16 18:36:55 +0100 <Ashkan> read-input method is provided (`try`)
2023-03-16 18:37:03 +0100 <monochrom> 1. Examples of useful programs written in terms of those methods only ("programming to the interface"). More examples are stronger evidence.
2023-03-16 18:37:04 +0100cheater(~Username@user/cheater)
2023-03-16 18:37:28 +0100 <monochrom> 2. Examples of useful instances of those classes. More examples are stronger evidence.
2023-03-16 18:38:29 +0100 <monochrom> Here is an example of someone achieving #1 brilliantly, but only because #2 is basically non-existent, thus showing that their abstraction is garbage.
2023-03-16 18:38:37 +0100hugo-(znc@verdigris.lysator.liu.se) (Ping timeout: 256 seconds)
2023-03-16 18:39:00 +0100 <EvanR> most turn based games do have to do something apart from user input. Nethack is maybe the exception which can only manage to have the cursor blink while the user is thinking
2023-03-16 18:39:03 +0100 <monochrom> There is a joke among mathematicians about an unlucky PhD student.
2023-03-16 18:39:35 +0100segfaultfizzbuzz(~segfaultf@108.211.201.53)
2023-03-16 18:39:59 +0100 <c_wraith> Ashkan: based on your questions after the last few weeks, I have to suggest you forget about scala completely when you're writing Haskell, and that you try to see how far you can get without ever creating a new class.
2023-03-16 18:40:19 +0100 <Ashkan> monochrom I have two example actually. (A) tic-tac-toe game. After coding I realised nowhere I used the non-blocking read-input so it game me the hint. (B) a rather contrived *counter* game which is not really a game per se but rather a process that increase a counter periodically and could be somehow controlled by input but progresses nonetheless
2023-03-16 18:40:20 +0100 <Ashkan> even if left on its own. In this counter game I only use the non-blocking read-input function. So far I have two perfect fits:D
2023-03-16 18:40:26 +0100 <monochrom> The PhD student thought up a new kind of abstraction --- the usual axioms of rings plus their own new axioms --- and can prove that every ring that satisifies those extra axioms have super-nice properties. So, like doing #1 with great success.
2023-03-16 18:40:56 +0100 <monochrom> The supervisor asked "can you give an actual example of such kind of rings?" The student said no.
2023-03-16 18:41:15 +0100 <monochrom> The supervisor went on to prove that the only ring that satisifies the extra axioms is {0}.
2023-03-16 18:41:22 +0100 <monochrom> So, #2 utterly fails.
2023-03-16 18:42:03 +0100 <c_wraith> is {0} even a ring? hmm. I suppose there's no requirement that the two identity elements be different
2023-03-16 18:42:16 +0100 <int-e> Rolling with #1 though I imagine there should be a notion of time in a real-time game abstraction.
2023-03-16 18:42:24 +0100 <monochrom> Yeah under some definitions {0} is allowed.
2023-03-16 18:42:30 +0100 <EvanR> I miss the old days when haskell game questions instantly turned into suggestions and discussion of FRP. A system with really nice properties and no real examples xD
2023-03-16 18:42:39 +0100 <int-e> Starting with #2 seems more healthy.
2023-03-16 18:42:40 +0100 <monochrom> But it's a joke so I can easily say {0,1} instead. :)
2023-03-16 18:43:22 +0100 <monochrom> Right. Exactly the disease of most OO people to start with #1 exclusively.
2023-03-16 18:43:25 +0100 <int-e> monochrom: hey at least there was *one* example
2023-03-16 18:43:56 +0100 <Ashkan> EvanR thank you for the example. This is a client-server game host (of sorts). In the world of my project (which is sometimes intentionally contrived to force certain ideas) a turn based game does not progress unless input is provided. The client side is at liberty to do its own thing while waiting for output from the game.
2023-03-16 18:44:31 +0100 <int-e> (People complain about premature optimization but nobody complains about premature abstraction.)
2023-03-16 18:44:46 +0100 <c_wraith> I actually see a lot of people trying to do things like unify mutable and persistent data structures under a single class somewhat often. that's a case where #2 is easy but #1 fails
2023-03-16 18:44:47 +0100 <monochrom> Oh but I did :)
2023-03-16 18:44:52 +0100 <int-e> monochrom: I know :)
2023-03-16 18:44:53 +0100 <monochrom> @quote monochrom premature
2023-03-16 18:44:53 +0100 <lambdabot> monochrom says: premature generality is the root of OOP
2023-03-16 18:44:58 +0100 <EvanR> OO is full of examples. Unicorn horse, circle ellipse, you name it
2023-03-16 18:45:05 +0100 <int-e> monochrom: Okay, I didn't know of that instance.
2023-03-16 18:45:06 +0100 <EvanR> cat meow
2023-03-16 18:45:45 +0100 <int-e> DesignPatternFactoryMethod
2023-03-16 18:45:53 +0100 <monochrom> Anyway, both Piaget's theory for teaching-learning and programmers' advice of "make a prototype first" say that you should start with #2 not #1.
2023-03-16 18:46:01 +0100Nosrep(~Nosrep@user/nosrep) (Remote host closed the connection)
2023-03-16 18:46:37 +0100 <monochrom> OO does not have to start with #1 but unfortunately most OO teachers teach that. Premature future-proofing, without even knowing the future.
2023-03-16 18:47:41 +0100Pickchea(~private@user/pickchea) (Ping timeout: 256 seconds)
2023-03-16 18:47:41 +0100ghostbuster(~admin@user/ghostbuster) (Ping timeout: 256 seconds)
2023-03-16 18:48:01 +0100 <monochrom> The expression problem implies that there are at least two possible futures and future-proofing for one of them conflicts with future-proofing the other, so you will always be wrong (Murphy's law).
2023-03-16 18:48:05 +0100Pickchea(~private@user/pickchea)
2023-03-16 18:48:34 +0100chele_(~chele@user/chele)
2023-03-16 18:48:49 +0100segfaultfizzbuzz(~segfaultf@108.211.201.53) (Ping timeout: 256 seconds)
2023-03-16 18:49:13 +0100 <Ashkan> I have to read everything here twice, once read everything quickly and then again more carefully filter all your OOP-this OOP-that ,hmmm , opinions to actually get to the point of what your guys are saying:D  I've been warned but honestly didn't expect this to be true:D
2023-03-16 18:49:53 +0100whatsupdoc(uid509081@id-509081.hampstead.irccloud.com)
2023-03-16 18:49:55 +0100 <EvanR> OOP courses have to future proof their own need for existence
2023-03-16 18:50:09 +0100ghostbuster(~admin@user/ghostbuster)
2023-03-16 18:50:09 +0100 <monochrom> heh
2023-03-16 18:50:30 +0100 <EvanR> you're right why are we even talking about OOP
2023-03-16 18:50:49 +0100 <EvanR> this is worse than AI
2023-03-16 18:51:00 +0100chele(~chele@user/chele) (Ping timeout: 246 seconds)
2023-03-16 18:51:00 +0100 <monochrom> Oh that's because the pasted classes obviously came from OO thinking. :)
2023-03-16 18:51:06 +0100 <Ashkan> I'm trying to understand why #2 is more important. So idea is if nothing fits the abstraction then its useless, right ? kinda obvious honestly or is there like a deeper meaning I'm missing ?
2023-03-16 18:51:44 +0100 <monochrom> Oh, all great truths are obvious tautologies that people don't want to believe.
2023-03-16 18:52:52 +0100 <monochrom> And that makes those tautologies so deep. At least feeling so deep.
2023-03-16 18:53:20 +0100 <EvanR> every theorem is obvious once you have the proof, someone told me
2023-03-16 18:53:23 +0100 <monochrom> My http://www.vex.net/~trebla/humour/tautologies.html is full of them :)
2023-03-16 18:53:40 +0100 <int-e> Ashkan: Without examples to abstract from your abstraction will probably either provide too little or too much to fit the use cases, and erring on either side is painful (one side more than the other)
2023-03-16 18:54:02 +0100hugo(znc@verdigris.lysator.liu.se)
2023-03-16 18:54:23 +0100Guest31(~Guest31@rrcs-74-219-213-86.central.biz.rr.com)
2023-03-16 18:58:13 +0100 <Ashkan> Okay so , unless I'm missing the point here, there is only so much I can do right now in terms of examples. But that is the case with all the abstractions. If I had every (or even most of) actual things I'm gonna write against this and only then being to abstract away then I would simply refactor mechanically till the type-classes emerge.
2023-03-16 18:58:40 +0100 <geekosaur> if any do
2023-03-16 18:58:49 +0100 <geekosaur> most people never have to define a typeclass
2023-03-16 18:58:55 +0100 <int-e> I guess I should say "generalization" because there's also the notion of "abstraction" that's about having a well-defined public interface. Which, in Haskell, you can achieve through modules; there's no need to have type classes.
2023-03-16 18:59:32 +0100 <Ashkan> The point is to have rather very few but (hopefully) *representative* examples and try to exercise one's abstracting skills to a *problem statement*, not the solution !
2023-03-16 19:00:40 +0100freeside(~mengwong@122.11.248.245)
2023-03-16 19:01:32 +0100 <EvanR> to get concrete about blocking and non-blocking I/O stuff, check out haskell's concurrency primitives so you don't have to deal with blocking and non-blocking versions of things. I.e. use blocking everywhere
2023-03-16 19:02:19 +0100 <monochrom> I don't abstract until there is sufficient benefit to abstract. So, until I repeat myself badly enough.
2023-03-16 19:02:20 +0100 <EvanR> non-blocking I/O is this thing you need in C because multiple threads are so painful
2023-03-16 19:03:15 +0100hugo(znc@verdigris.lysator.liu.se) (Ping timeout: 246 seconds)
2023-03-16 19:03:22 +0100 <monochrom> Plus the bonus that I actually see what I'm repeating at all.
2023-03-16 19:04:14 +0100 <monochrom> If you say you already have two games and so you already know what they're repeating and your classes came from that, then cool.
2023-03-16 19:05:58 +0100 <Ashkan> For example an application framework or a lib author might have a few real world example to being with and following this advice it would result in a piece of code that overfits those particular examples but can't comfortable model anything else. There is always a degree of introspection and seeing-into-the-future when modelling
2023-03-16 19:05:58 +0100 <Ashkan> abstractions/generalisations. The whole point is that you don't have enough to mechanically arrive at a solution !
2023-03-16 19:06:36 +0100 <monochrom> Oh this is why versions 1, 2, 3, 4... all exist. :)
2023-03-16 19:07:31 +0100cheater(~Username@user/cheater) (Ping timeout: 256 seconds)
2023-03-16 19:07:55 +0100 <Ashkan> That is also true but happens as a natural outcome of "not knowing everything right now" rather than "don't generalise because OOP":)
2023-03-16 19:08:39 +0100 <monochrom> Well, like I said, OO is not by itself premature abstraction, but OO people do that all the time.
2023-03-16 19:09:08 +0100 <monochrom> There is an economic plus Dunning-Kruger explanation.
2023-03-16 19:09:28 +0100 <int-e> Without context, https://paste.tomsmeding.com/0fxeAcDL is a great example of premature abstraction.
2023-03-16 19:09:31 +0100 <monochrom> Those who are actually good at guessing good abstractions have all gone to mathematics.
2023-03-16 19:09:33 +0100freeside(~mengwong@122.11.248.245) (Ping timeout: 246 seconds)
2023-03-16 19:09:50 +0100 <monochrom> Programming is left with those who are bad at it.
2023-03-16 19:10:16 +0100 <int-e> There may be a context in which this is useful, but I find it hard to imagine what that would be.
2023-03-16 19:10:22 +0100 <monochrom> Now enter Dunning-Kruger to see that programmers think they're great at abstractions.
2023-03-16 19:10:26 +0100cheater(~Username@user/cheater)
2023-03-16 19:10:35 +0100 <EvanR> this discussion is overly abstract xD
2023-03-16 19:11:17 +0100shapr(~user@68.54.166.125)
2023-03-16 19:12:47 +0100 <monochrom> Programmers are also super grateful that OO allows them to feel productive (as opposed to being productive) because they can mindlessly write scaffolding and procrastinate asking the difficult questions.
2023-03-16 19:13:52 +0100 <EvanR> that's a downside of haskell. I often realize I could just write the code to solve the problem without setting up a bunch of engineering first. So instead of cart before the horse there's just no cart
2023-03-16 19:14:13 +0100 <monochrom> Haskell looks so hard because after writing "f x y =" you now have to immediately ask yourself which algorithm to use, why it's correct. No room for procrastination.
2023-03-16 19:14:35 +0100 <monochrom> In OO you could keep on writing more class declarations.
2023-03-16 19:14:46 +0100cheater_(~Username@user/cheater)
2023-03-16 19:15:19 +0100cheater(~Username@user/cheater) (Ping timeout: 260 seconds)
2023-03-16 19:15:21 +0100cheater_cheater
2023-03-16 19:16:11 +0100Guest31(~Guest31@rrcs-74-219-213-86.central.biz.rr.com) (Quit: Client closed)
2023-03-16 19:16:32 +0100 <monochrom> Again, not to say that OO is meant to be abused this way, but consider human nature, what do you think selfish mediocre people actually want to do?
2023-03-16 19:18:09 +0100 <int-e> . o O ( type RealTimeGame m i o = TurnBasedGame m (Maybe i) o )
2023-03-16 19:18:24 +0100 <int-e> . o O ( Looks weird, doesn't it? )
2023-03-16 19:19:02 +0100 <monochrom> That may require some kind of discrete-time assumption...
2023-03-16 19:19:38 +0100 <int-e> Yeah I was getting there... I imagine the idea is to read input once per frame or some other sort of tick.
2023-03-16 19:20:05 +0100 <monochrom> With this, one cannot avoid mentioning FRP any longer :)
2023-03-16 19:22:54 +0100 <EvanR> FRP!
2023-03-16 19:23:22 +0100 <Ashkan> Honestly I'm not sure I'm following ... lets make this conversation even more useful by solving this problem :
2023-03-16 19:23:22 +0100 <Ashkan> Model the following:
2023-03-16 19:23:23 +0100 <Ashkan> There is a client-server game setting. Games actually run on the server side and receive input / provide output. There is no graphics or rendering or complex IO of any kind to these games. All they do is to process input and produce output.
2023-03-16 19:23:23 +0100 <Ashkan> There is a distinction between games that do not progress until next input is provided and those that might progress even if no input is provided.
2023-03-16 19:23:28 +0100 <int-e> hmm "fast reverse proxy"
2023-03-16 19:24:01 +0100bitmapper(uid464869@id-464869.lymington.irccloud.com) (Quit: Connection closed for inactivity)
2023-03-16 19:24:27 +0100 <int-e> Ashkan: You can do that but WHY?
2023-03-16 19:24:42 +0100gnalzo(~gnalzo@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c)
2023-03-16 19:25:24 +0100segfaultfizzbuzz(~segfaultf@108.211.201.53)
2023-03-16 19:26:00 +0100 <int-e> People write game. Some games are client-server games. What's the context in which you have so many different games that you want to abstract from them uniformly? And what makes you think that you can do that abstraction in a meaningful way without having a collection of actual games first?
2023-03-16 19:26:19 +0100man_max(~man_max@94-43-231-47.dsl.utg.ge)
2023-03-16 19:26:21 +0100talismanick(~talismani@2601:200:c000:f7a0::5321)
2023-03-16 19:27:39 +0100 <EvanR> that client already has mildly complex IO requirements because of the full duplex
2023-03-16 19:27:58 +0100cassiopea(~cassiopea@user/cassiopea) (Remote host closed the connection)
2023-03-16 19:28:01 +0100 <Ashkan> To avoid the million questions that could be asked about why a real programmer (as opposed to a Dun-Krueger OOP programmer) would ever want to do this exercise, assume you are given 1 million $ reward if you can provide a as-possibly-correct-as-reasonably-feasible answer. So our programmer has every motivation to get this as right as possible. Good
2023-03-16 19:28:01 +0100 <Ashkan> enough:D  ?
2023-03-16 19:28:16 +0100 <EvanR> unless you never get anything from the server except after sending a message, and you get everything immediately
2023-03-16 19:28:57 +0100 <Ashkan> The *game* has very limited access to the outside world (ideally only input/output but has to be seen). Everything else is handled by the *server* that hosts the game
2023-03-16 19:29:00 +0100 <EvanR> in which case you can loop get command, send command, wait for response, print response
2023-03-16 19:29:00 +0100 <int-e> Note that what you ended up with is a limited I/O abstraction with no relation to games when we ignore the identifiers.
2023-03-16 19:29:34 +0100hugo(znc@verdigris.lysator.liu.se)
2023-03-16 19:29:58 +0100 <Ashkan> Essentially server provides input/output functions to the games. Games are to express their logic using the methods in the type-classes when they need input or are ready to emit an output
2023-03-16 19:30:04 +0100 <int-e> How is this supposed to help with correctness...
2023-03-16 19:30:27 +0100 <int-e> Eh, I don't think we'll agree that this is in any way useful. I'll shut up.
2023-03-16 19:31:16 +0100Major_Biscuit(~MajorBisc@c-001-031-036.client.tudelft.eduvpn.nl) (Ping timeout: 252 seconds)
2023-03-16 19:31:19 +0100 <EvanR> > forever ((getLine >>= sendCommand) >> (awaitResponse >>= putStrLn))
2023-03-16 19:31:21 +0100 <lambdabot> error:
2023-03-16 19:31:21 +0100 <lambdabot> Variable not in scope: sendCommand :: String -> IO a0error:
2023-03-16 19:31:21 +0100 <lambdabot> Variable not in scope: awaitResponse :: IO String
2023-03-16 19:31:31 +0100 <EvanR> I meant to do that
2023-03-16 19:31:43 +0100 <Ashkan> I am *defining* a game as "something that doesn't do IO, only needs input and provides output as it processes the inputs and progresses the state"
2023-03-16 19:32:16 +0100 <EvanR> are you talking about the server code or client code, because I think I just solved every client of this class above
2023-03-16 19:33:14 +0100man_max(~man_max@94-43-231-47.dsl.utg.ge) (Quit: Client closed)
2023-03-16 19:34:00 +0100 <Ashkan> You guys simply can not accept that I *can* define notions that might not make much sense to you. The way to go is to just accept those notions from me (who is *defining* a world with those notions as the problem space) and then evaluate a proposed abstraction *against those definitions,*, not against your own ideas of what a game is.
2023-03-16 19:34:29 +0100 <Ashkan> This is all in server code
2023-03-16 19:34:55 +0100 <int-e> 18:34:45 <Ashkan> Does this make sense https://paste.tomsmeding.com/0fxeAcDL ?
2023-03-16 19:35:01 +0100 <int-e> Not to us, evidently.
2023-03-16 19:36:03 +0100 <geekosaur> the point is this is almost always "wrong use of typeclass"
2023-03-16 19:36:17 +0100 <int-e> At least now it sounds more like you want a kind of sandbox.
2023-03-16 19:36:19 +0100 <geekosaur> sure, you can define it. and make your life hell later
2023-03-16 19:36:31 +0100 <int-e> That wasn't clear 5 minutes ago.
2023-03-16 19:36:40 +0100 <geekosaur> becuase if it's "wring use of typeclass" it WILL bite you later
2023-03-16 19:36:51 +0100 <geekosaur> *wrong
2023-03-16 19:36:52 +0100mncheck(~mncheck@193.224.205.254) (Ping timeout: 246 seconds)
2023-03-16 19:36:59 +0100cassiopea(~cassiopea@user/cassiopea)
2023-03-16 19:37:07 +0100Major_Biscuit(~MajorBisc@2001:1c00:2408:a400:67e:5371:52a7:9b9a)
2023-03-16 19:37:30 +0100freeside(~mengwong@122.11.248.245)
2023-03-16 19:37:35 +0100 <int-e> It's still useless without concrete types for i and o; and the distinction between realtime and non-realtime is still tenuous.
2023-03-16 19:37:51 +0100 <int-e> And wouldn't implementors be better served with having a game-specific EDSL?
2023-03-16 19:38:11 +0100man_max(~man_max@94-43-231-47.dsl.utg.ge)
2023-03-16 19:39:28 +0100 <dminuoso> Sigh, GHC strikes again.
2023-03-16 19:39:38 +0100 <int-e> @ghc
2023-03-16 19:39:39 +0100 <lambdabot> The signature contexts in a mutually recursive group should all be identical
2023-03-16 19:39:52 +0100 <dminuoso> `No instance for (Database.PostgreSQL.Simple.ToField.ToField EMailAddress) arising from a use of ‘executeMany’`
2023-03-16 19:40:06 +0100 <dminuoso> Let me ask a perhaps weird question, but what is the factual information here?
2023-03-16 19:40:17 +0100 <dminuoso> GHC is not telling me *why* the constraint arises.
2023-03-16 19:40:38 +0100 <Ashkan> A game accepts only values of a certain type as input `i` and can produce values of a certain type as output `o`. Why do you need concrete types for that to make sense ?
2023-03-16 19:41:27 +0100 <dminuoso> Oh gah, I think I know why. GHC could really do better, perhaps something like `Hey, in your use of executeMany I had to resolve ToRow a, I picked this instance, that instance introduced that new constraint I couldnt satisfy`...
2023-03-16 19:41:36 +0100 <EvanR> another thing is sometimes a record instead of a typeclass is more flexible, so maybe you can combine and nest games dynamically
2023-03-16 19:41:36 +0100Guest31(~Guest31@rrcs-74-219-213-86.central.biz.rr.com)
2023-03-16 19:41:38 +0100 <mauke> <EvanR> non-blocking I/O is this thing you need in C because multiple threads are so painful <- and in Haskell, if you want tractable semantics
2023-03-16 19:41:41 +0100 <Ashkan> int-e about the EDSL, they could be ... but how does that related to input/output ? in a way this is a very minimal DSL for input/output.
2023-03-16 19:41:51 +0100 <int-e> dminuoso: Is that the whole error? But it's clearly from simplifying a ToRow constraint, as you're finding out.
2023-03-16 19:42:12 +0100 <dminuoso> int-e: Yes (well there's some source hint where it originated from)
2023-03-16 19:42:25 +0100 <dminuoso> It's just incredibly frustrating to not have more details how this constraint arised.
2023-03-16 19:42:37 +0100 <dminuoso> Especially because GHC *knows* why, it did the journey itself.
2023-03-16 19:42:41 +0100hugo(znc@verdigris.lysator.liu.se) (Ping timeout: 265 seconds)
2023-03-16 19:43:00 +0100 <int-e> . o O ( arose )
2023-03-16 19:43:10 +0100 <int-e> (or a-rows?)
2023-03-16 19:43:24 +0100 <dminuoso> Yeah I guess arose.
2023-03-16 19:43:34 +0100y04nn(~username@2a03:1b20:5:f011::aaae)
2023-03-16 19:43:42 +0100 <dminuoso> But unless GHC gets better at diagnostics, Im not going to improve my English.
2023-03-16 19:43:46 +0100 <dminuoso> Im holding it hostage that way.
2023-03-16 19:43:52 +0100 <int-e> dminuoso: it probably doesn't remember the constraint simplification steps
2023-03-16 19:44:12 +0100 <int-e> dminuoso: you're not hurting GHC, you're hurting people
2023-03-16 19:44:22 +0100 <dminuoso> Oh I see. So I should just stop improving my Haskell then.
2023-03-16 19:44:49 +0100 <dminuoso> Think it will budge?
2023-03-16 19:46:11 +0100 <int-e> I doubt it. I mean, yes, it would be nice to have an indication that the constraint used to be a "ToRow" constraint originally, rather than having to wade through the docs for that information. But I suspect the information is not readily available anymore when the type error manifests.
2023-03-16 19:46:18 +0100Major_Biscuit(~MajorBisc@2001:1c00:2408:a400:67e:5371:52a7:9b9a) (Ping timeout: 252 seconds)
2023-03-16 19:52:19 +0100 <dminuoso> Okay. So the underlying error was using [] instead of ()
2023-03-16 19:52:38 +0100 <dminuoso> I will just file this under "typeclasses are not fun"
2023-03-16 19:53:12 +0100hugo(znc@verdigris.lysator.liu.se)
2023-03-16 19:53:38 +0100freeside(~mengwong@122.11.248.245) (Ping timeout: 252 seconds)
2023-03-16 19:55:49 +0100 <int-e> dminuoso: Huh, how did it arrive at EMailAddress specifically then? I guess it depends on where you put that []...
2023-03-16 19:56:22 +0100 <dminuoso> Oh I just wrote `executeMany conn qry [toEntity <$> addresses]` with addresses being a list
2023-03-16 19:57:10 +0100 <dminuoso> Which produced some `[[EMailAddress]]`, so it ended up having to solve for `ToRow [EmailAddress]`, matching up with ToField a => ToRow [a]
2023-03-16 19:57:53 +0100 <dminuoso> Its kind of funny because I remember wondering "dont I need a =<< here? this looks like a nested list.. uh I dont know - the compiler will surely tell me if Im doing something wrong"
2023-03-16 19:58:27 +0100 <int-e> Ah, and it did, but in the form of a riddle.
2023-03-16 19:59:53 +0100 <EvanR> GHC as an imposing sphinx
2023-03-16 20:00:19 +0100 <EvanR> your code shall not pass without answering the riddles
2023-03-16 20:01:01 +0100 <opqdonut> oof I hate the ToRow ToField stuff
2023-03-16 20:01:11 +0100 <opqdonut> feels like a JS API in Haskell
2023-03-16 20:03:54 +0100 <sm> good idea for a mascot / logo EvanR
2023-03-16 20:04:16 +0100 <EvanR> some other functional or logic languages has to have already claimed that
2023-03-16 20:04:41 +0100slack1256(~slack1256@186.11.43.166)
2023-03-16 20:05:36 +0100 <sm> no! it shall be ours!
2023-03-16 20:06:50 +0100coot(~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba)
2023-03-16 20:13:36 +0100eggplantade(~Eggplanta@2600:1700:38c5:d800:7045:17e1:cef7:25cd) (Remote host closed the connection)
2023-03-16 20:19:31 +0100 <tomsmeding> I asked dall-e for "Haskell mascot" and it seems it's having trouble spelling "haskell"
2023-03-16 20:19:40 +0100 <tomsmeding> besides choosing US sports themed stuff
2023-03-16 20:19:49 +0100 <tomsmeding> https://tomsmeding.com/ss/get/tomsmeding/ZgJ1Gg
2023-03-16 20:22:09 +0100freeside(~mengwong@122.11.248.245)
2023-03-16 20:23:44 +0100 <EvanR> for a split second I thought the one of the right used a lambda instead of a K
2023-03-16 20:26:19 +0100freeside(~mengwong@122.11.248.245) (Ping timeout: 250 seconds)
2023-03-16 20:28:56 +0100 <sm> a most valuable haskell language post ! https://typeclasses.substack.com/p/whats-new-in-ghc-2021
2023-03-16 20:29:36 +0100slack1256(~slack1256@186.11.43.166) (Ping timeout: 255 seconds)
2023-03-16 20:29:48 +0100 <dminuoso> "What's new in GHC 2021" - an article written in 2023.
2023-03-16 20:29:52 +0100 <dminuoso> :)
2023-03-16 20:30:45 +0100 <monochrom> haha
2023-03-16 20:32:33 +0100 <monochrom> Also the wrong but credible interpretation that GHC2021 of 2023 is different from GHC2021 of 2021 hence "what's new" in 2023.
2023-03-16 20:34:16 +0100 <monochrom> Personally I would think up the title "GHC2021 is a perfectly balanced language with no exploits" >:)
2023-03-16 20:34:40 +0100 <monochrom> P.S. I just bought Yorkshire Tea yesterday!
2023-03-16 20:40:08 +0100 <mauke> "The forall keyword is added, letting you explicitly bind type variable names. This is called existential quantification" - ah, yes
2023-03-16 20:40:27 +0100 <EvanR> while we're calling everything wrong, waiting a year after GHC2021 to make a blog post doesn't add up to 2023
2023-03-16 20:41:19 +0100jero98772(~jero98772@2800:484:1d80:d8ce:efcc:cbb3:7f2a:6dff)
2023-03-16 20:42:01 +0100 <monochrom> That one is excused by "or so". :)
2023-03-16 20:42:13 +0100Guest31(~Guest31@rrcs-74-219-213-86.central.biz.rr.com) (Quit: Client closed)
2023-03-16 20:44:17 +0100 <EvanR> error bars!
2023-03-16 20:48:56 +0100ft(~ft@p3e9bc443.dip0.t-ipconnect.de)
2023-03-16 20:51:02 +0100coot(~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba) (Quit: coot)
2023-03-16 20:51:07 +0100bhall(brunohall@gateway/vpn/protonvpn/bhall) (Ping timeout: 248 seconds)
2023-03-16 20:53:30 +0100freeside(~mengwong@122.11.248.245)
2023-03-16 20:54:24 +0100jappiejappie(~jappiejap@89-70-67-77.dynamic.chello.pl)
2023-03-16 20:58:01 +0100freeside(~mengwong@122.11.248.245) (Ping timeout: 256 seconds)
2023-03-16 21:08:34 +0100freeside(~mengwong@122.11.248.245)
2023-03-16 21:10:17 +0100y04nn(~username@2a03:1b20:5:f011::aaae) (Ping timeout: 246 seconds)
2023-03-16 21:12:06 +0100segfaultfizzbuzz(~segfaultf@108.211.201.53) (Ping timeout: 265 seconds)
2023-03-16 21:13:07 +0100freeside(~mengwong@122.11.248.245) (Ping timeout: 250 seconds)
2023-03-16 21:14:04 +0100eggplantade(~Eggplanta@2600:1700:38c5:d800:7045:17e1:cef7:25cd)
2023-03-16 21:16:48 +0100y04nn(~username@2a03:1b20:5:f011::aaae)
2023-03-16 21:18:20 +0100eggplantade(~Eggplanta@2600:1700:38c5:d800:7045:17e1:cef7:25cd) (Ping timeout: 246 seconds)
2023-03-16 21:19:28 +0100pavonia(~user@user/siracusa)
2023-03-16 21:37:35 +0100Ashkan(~Ashkan@ec2-54-78-14-109.eu-west-1.compute.amazonaws.com) (Quit: Client closed)
2023-03-16 21:40:05 +0100segfaultfizzbuzz(~segfaultf@108.211.201.53)
2023-03-16 21:40:25 +0100codaraxis(~codaraxis@user/codaraxis) (Ping timeout: 246 seconds)
2023-03-16 21:40:40 +0100freeside(~mengwong@122.11.248.245)
2023-03-16 21:41:19 +0100ubert1(~Thunderbi@p200300ecdf0c5775fd3777de0335b9cc.dip0.t-ipconnect.de)
2023-03-16 21:43:29 +0100finsternis(~X@23.226.237.192)
2023-03-16 21:44:18 +0100segfaultfizzbuzz(~segfaultf@108.211.201.53) (Ping timeout: 255 seconds)
2023-03-16 21:45:12 +0100freeside(~mengwong@122.11.248.245) (Ping timeout: 255 seconds)
2023-03-16 21:47:43 +0100lxi(~quassel@2a02:2f08:4303:7700:8735:4ae1:b0f9:22e6)
2023-03-16 21:51:37 +0100zeenk(~zeenk@2a02:2f04:a307:2300::7fe) (Quit: Konversation terminated!)
2023-03-16 21:52:42 +0100y04nn(~username@2a03:1b20:5:f011::aaae) (Remote host closed the connection)
2023-03-16 21:56:22 +0100segfaultfizzbuzz(~segfaultf@108.211.201.53)
2023-03-16 21:56:22 +0100infinity0(~infinity0@pwned.gg) (Remote host closed the connection)
2023-03-16 21:58:30 +0100infinity0(~infinity0@pwned.gg)
2023-03-16 22:01:24 +0100lxi_(~quassel@2a02:2f08:4303:7700:6251:77c:f4b2:f7b8)
2023-03-16 22:01:55 +0100lxi(~quassel@2a02:2f08:4303:7700:8735:4ae1:b0f9:22e6) (Ping timeout: 260 seconds)
2023-03-16 22:04:09 +0100Pickchea(~private@user/pickchea) (Quit: Leaving)
2023-03-16 22:04:30 +0100bhall(brunohall@gateway/vpn/protonvpn/bhall)
2023-03-16 22:05:27 +0100_ht(~Thunderbi@28-52-174-82.ftth.glasoperator.nl) (Quit: _ht)
2023-03-16 22:14:48 +0100freeside(~mengwong@122.11.248.245)
2023-03-16 22:15:41 +0100codaraxis(~codaraxis@user/codaraxis)
2023-03-16 22:15:49 +0100L29Ah(~L29Ah@wikipedia/L29Ah)
2023-03-16 22:19:13 +0100man_max(~man_max@94-43-231-47.dsl.utg.ge) (Quit: Client closed)
2023-03-16 22:20:37 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl)
2023-03-16 22:22:05 +0100gnalzo(~gnalzo@2a01:e0a:498:fd50:fcc6:bb5d:489a:ce8c) (Quit: WeeChat 3.8)
2023-03-16 22:22:42 +0100 <dminuoso> mauke: Can we have an exists too for universal quantification?
2023-03-16 22:22:55 +0100freeside(~mengwong@122.11.248.245) (Ping timeout: 260 seconds)
2023-03-16 22:24:27 +0100zeenk(~zeenk@2a02:2f04:a307:2300::7fe)
2023-03-16 22:24:58 +0100 <mauke> ∃∃∃
2023-03-16 22:28:46 +0100andrew78(~andrew@2a01:4b00:d108:2500:36c8:5cfb:343b:f1f3)
2023-03-16 22:29:36 +0100 <andrew78> Question about the capability library. I've got a `HasState "name" Type m`, is there a way I can use this whenever I require a `HasReader "name" Type m` ?
2023-03-16 22:30:20 +0100 <dminuoso> HasState tag r m => HasReader (tag :: k) r (ReadStatePure m)
2023-03-16 22:30:28 +0100 <dminuoso> andrew78: ^- does this help?
2023-03-16 22:31:07 +0100 <dminuoso> So using the ReadStatePure newtype it seems you should be able to do something. But I dont know much about capability
2023-03-16 22:31:09 +0100 <andrew78> dminuoso yes and no, Ar eyou suggesting I implement this dminuoso
2023-03-16 22:31:14 +0100 <dminuoso> No, that instance exists
2023-03-16 22:31:29 +0100 <dminuoso> https://hackage.haskell.org/package/capability-0.5.0.1/docs/src/Capability.Reader.Internal.Strateg…
2023-03-16 22:34:24 +0100 <andrew78> Ah I see, but then why do I get "Could not deduce (HasReader "name" Type" m)  from context (HasState "name" Type m)"? I would assume it would make use of this instance to check the type of the callee
2023-03-16 22:35:19 +0100 <EvanR> did you use the newtype wrapper
2023-03-16 22:35:22 +0100michalz(~michalz@185.246.207.221) (Remote host closed the connection)
2023-03-16 22:35:39 +0100inversed(~inversed@bcdcac82.skybroadband.com) (Ping timeout: 248 seconds)
2023-03-16 22:35:58 +0100 <andrew78> No, you mean that I should wrap my call with `ReadStatePure`?
2023-03-16 22:36:16 +0100 <EvanR> the instance is for ReadStatePure
2023-03-16 22:36:34 +0100 <EvanR> m
2023-03-16 22:36:45 +0100 <andrew78> I'm sorry I don't see how that helps me. Am I supposed to use it in a deriving clause?
2023-03-16 22:37:04 +0100 <andrew78> I'm not trying to derive an instance, I'm just trying to call a `HasReader` from a `HasState`
2023-03-16 22:37:23 +0100ubert1(~Thunderbi@p200300ecdf0c5775fd3777de0335b9cc.dip0.t-ipconnect.de) (Ping timeout: 260 seconds)
2023-03-16 22:37:42 +0100 <EvanR> you apply newtype wrappers to bring in instances
2023-03-16 22:37:53 +0100 <EvanR> like Sum 4 <> Sum 6
2023-03-16 22:38:01 +0100 <EvanR> instead of 4 <> 6
2023-03-16 22:38:29 +0100takuan(~takuan@178-116-218-225.access.telenet.be) (Remote host closed the connection)
2023-03-16 22:38:47 +0100 <andrew78> yeah but I'm not dealing with concrete types, just with the capability classes
2023-03-16 22:39:17 +0100 <EvanR> whatever operation you need to do is on something right. Do you have example code
2023-03-16 22:39:37 +0100 <andrew78> I have `f :: (HasState "name" Ty) => m ()` and `g :: (HasReader "name" Ty m) => m ()` and I'm trying to do call g in f
2023-03-16 22:39:47 +0100freeside(~mengwong@122.11.248.245)
2023-03-16 22:40:21 +0100 <andrew78> mistyped the `f`: `f :: (HasState "name" Ty m) => m ()`
2023-03-16 22:41:31 +0100 <EvanR> ReadStatePure g
2023-03-16 22:41:57 +0100 <andrew78> `Couldn't match type `m' with `ReadStatePure m0'`
2023-03-16 22:42:35 +0100 <andrew78> which makes sense, I'm expecting `m` and this wraps the `m` into `ReadStatePure`. how can I get it out of `ReadStatePure` again?
2023-03-16 22:42:35 +0100 <EvanR> is it a case of needing ScopedTypeVariables and forall to introduce m so the type checker knows it's the same m or
2023-03-16 22:42:58 +0100 <andrew78> EvanR It's not
2023-03-16 22:43:03 +0100inversed(~inversed@bcdcac82.skybroadband.com)
2023-03-16 22:43:27 +0100 <andrew78> I have ScopedTypeVariables and I just tried adding forall and I get the same error. It makes sense to me
2023-03-16 22:43:33 +0100 <EvanR> well it needs to be the same underlying m
2023-03-16 22:44:07 +0100 <andrew78> I think the problem is that `m` != `ReadStatePure m`
2023-03-16 22:44:08 +0100freeside(~mengwong@122.11.248.245) (Ping timeout: 252 seconds)
2023-03-16 22:44:28 +0100 <EvanR> well you can unwrap any newtype wrapped thing
2023-03-16 22:44:36 +0100 <andrew78> as a matter of fact, forcing the `m` with a type application gives us the expected error `Occurs check: cannot construct the infinite type:
2023-03-16 22:44:36 +0100 <andrew78>         m ~ ReadStatePure m`
2023-03-16 22:44:39 +0100 <andrew78> EvanR how?
2023-03-16 22:44:48 +0100 <EvanR> :i Sum
2023-03-16 22:44:53 +0100 <EvanR> @src Sum
2023-03-16 22:44:53 +0100 <lambdabot> newtype Sum a = Sum { getSum :: a }
2023-03-16 22:45:07 +0100 <EvanR> in that case they added a handy accessor, but in this case they didn't add one so you need to pattern match
2023-03-16 22:45:36 +0100 <EvanR> > (\(Sum x) -> x) (Sum 5)
2023-03-16 22:45:38 +0100 <lambdabot> 5
2023-03-16 22:46:37 +0100 <andrew78> it makes no difference, I am back to square 1 with the error `Could not deduce (HasReader "name" Int m)`
2023-03-16 22:46:57 +0100 <andrew78> I did `f = let ReadStatePure r = ReadStatePure g in r`
2023-03-16 22:47:38 +0100 <EvanR> that does nothing
2023-03-16 22:48:08 +0100 <andrew78> that's literally what you otld me to do, the `ReadStatePure` newtype has no accessor, so I pattern matched on it
2023-03-16 22:48:26 +0100 <EvanR> you wrapped it and immediately unwrapped it
2023-03-16 22:48:30 +0100 <EvanR> could just put g instead
2023-03-16 22:48:47 +0100 <andrew78> yep, and that doesn't work, so what can I do?
2023-03-16 22:49:08 +0100Ashkan(~Ashkan@ec2-54-78-14-109.eu-west-1.compute.amazonaws.com)
2023-03-16 22:49:21 +0100 <EvanR> normally if you needed a newtype for a new instance, you'd unwrap it after you did the thing you needed to do and got something that wasn't what you started with
2023-03-16 22:49:31 +0100 <EvanR> > getSum (Sum 3 <> Sum 1)
2023-03-16 22:49:33 +0100 <lambdabot> 4
2023-03-16 22:50:12 +0100 <EvanR> when you just wrapped it and used it, I presume, and got can't match m with m0, maybe they really are different monads
2023-03-16 22:50:34 +0100 <Ashkan> Hello all. I'm trying to derive an Applicative for my newtype using `DerivingVia` but can't wrap my head around this "representation" thingie. I read a few examples yet can't figure out how to find an *equivalent* or suitable(?) type to give `via` to work with
2023-03-16 22:51:17 +0100 <andrew78> EvanR I am not working with concrete types, there is no monad at this point, just typeclasses
2023-03-16 22:51:25 +0100 <Ashkan> Can someone point me to a doc or an article or something about this please ? thanks
2023-03-16 22:52:40 +0100 <Ashkan> This is the code for reference
2023-03-16 22:52:40 +0100 <Ashkan> ```
2023-03-16 22:52:40 +0100 <andrew78> Ashkan I've been using this although it's not the best https://ghc.gitlab.haskell.org/ghc/doc/users_guide/exts/deriving_via.html
2023-03-16 22:52:41 +0100 <Ashkan> data Room i o = Room {ichan :: TChan i, ochan :: TChan o}
2023-03-16 22:52:41 +0100 <Ashkan> newtype RoomT i o a = RoomT {runRoomT :: Room i o -> IO a} deriving (Functor, Applicative) via _
2023-03-16 22:52:42 +0100 <Ashkan> ```
2023-03-16 22:53:14 +0100 <TheMatten[m]> Ashkan: What `deriving via` does is that it uses `coerce` to "coerce" type of your newtype into some other type you mention in `deriving via` clause, and basically reuses it's instance - see https://hackage.haskell.org/package/base-4.18.0.0/docs/Data-Coerce.html for how `coerce` works
2023-03-16 22:53:32 +0100 <Ashkan> andrew78 thanks. Yeah read that already, can't figure it out for my case thought ...
2023-03-16 22:54:09 +0100 <TheMatten[m]> Ashkan: You probably want `deriving (Functor, Applicative, Monad) via ReaderT (Room i o) IO`
2023-03-16 22:55:28 +0100 <TheMatten[m]> Because `ReaderT r m a` is newtype over `r -> m a`, which matches shape of your inner type
2023-03-16 22:57:47 +0100 <Ashkan> I was thinking Kleisli perhaps ... but honestly can't yet form an intuition around this
2023-03-16 22:58:03 +0100 <Ashkan> by the way, what is a "representation" of a type, exactly ?
2023-03-16 22:58:50 +0100jappiejappie(~jappiejap@89-70-67-77.dynamic.chello.pl) (Quit: Client closed)
2023-03-16 23:00:45 +0100 <TheMatten[m]> Ashkan: Hmm, yeah, but usually you'll probably want to derive in terms of types from `transformers`/`mtl`, because those have parameters in convenient order when you want to compose them
2023-03-16 23:00:56 +0100 <TheMatten[m]> Ashkan: I guess that sort of depends on context in which you're asking
2023-03-16 23:01:58 +0100 <TheMatten[m]> You may say two types have same "representation" if they're "coercible" through `coerce` interface (which I guess is your case here)
2023-03-16 23:02:12 +0100 <Ashkan> Let me tell you my understanding and you tell me were I'm wrong:
2023-03-16 23:02:13 +0100 <Ashkan> A `newtype` is essentially a wrapper around some other type. This other type is the representation of the newtype
2023-03-16 23:03:04 +0100 <Ashkan> So `newtype Foo a b = Foo { name :: <some-type of a and b> }` then "<some type of a and b>" is the representation here
2023-03-16 23:03:07 +0100 <Ashkan> so far correct ?
2023-03-16 23:03:26 +0100 <TheMatten[m]> Ashkan: I mean, yeah, in principle
2023-03-16 23:03:26 +0100 <TheMatten[m]> You could have nested newtypes too, and you can imagine that they could too be unwrapped to expose type that doesn't have any newtypes
2023-03-16 23:03:32 +0100 <mauke> the <...> part does not have to use a or b
2023-03-16 23:04:11 +0100 <Ashkan> yeah could be phantoms (that's the name, right ?) but didn't want to complicate things
2023-03-16 23:05:33 +0100 <Ashkan> Now it comes to logic that since `newtype` (at least the simple, one layer ones) do not hide any inner structure or something, then essentially GHC should in principle be able to derive instances for the `newtype` if it can derive (or find) the instance for the representation, right ?
2023-03-16 23:08:02 +0100 <mauke> Ashkan: https://downloads.haskell.org/ghc/latest/docs/users_guide/exts/newtype_deriving.html
2023-03-16 23:08:37 +0100 <Ashkan> I've read all the standard doc, except for this `coerce` thingie:D
2023-03-16 23:09:10 +0100 <mauke> you don't need coerce for generalized newtype deriving, though
2023-03-16 23:09:26 +0100 <Ashkan> my problem is I can't figure out *how* to arrive at the suitable representation of my type to give it to `via`
2023-03-16 23:10:06 +0100 <Ashkan> mauke yeah but generelized deriving failed with a message to the effect that it can not arrive at the proper eta-reduction
2023-03-16 23:10:35 +0100 <Ashkan> That's why I turned into the (to my understanding) more powerful `DervivingVia`
2023-03-16 23:10:38 +0100freeside(~mengwong@122.11.248.245)
2023-03-16 23:10:47 +0100 <mauke> why not just write the instance manually?
2023-03-16 23:11:43 +0100 <Ashkan> mauke I did actually ! yet I have a feeling that if I did everything right, then GHC should be able to derive all the way to `MonadIO` with minimal help from me
2023-03-16 23:11:52 +0100 <mauke> but yeah, what TheMatten[m] said
2023-03-16 23:12:19 +0100 <mauke> your type is essentially a composition of IO and (Room i o ->) applied to a
2023-03-16 23:12:36 +0100 <mauke> which corresponds to ReaderT ArgumentType IO
2023-03-16 23:13:24 +0100 <Ashkan> it is `Room i o -> IO a` . Trying to figure out a representation for it (?) although it is itself a representation of something else:D
2023-03-16 23:13:49 +0100 <mauke> newtype RoomT i o a = RoomT{ runRoomT :: ReaderT (Room i o) IO a } deriving (Functor, Applicative) -- :-)
2023-03-16 23:14:07 +0100 <Ashkan> But isn't `ReaderT a IO` the opposite ? is it not supposed to produce an `a` in an `IO` setting ?
2023-03-16 23:14:57 +0100 <mauke> no, ReaderT Env IO a produces an `a` in an `IO` setting *given some environment of type `Env`*
2023-03-16 23:15:21 +0100freeside(~mengwong@122.11.248.245) (Ping timeout: 268 seconds)
2023-03-16 23:15:39 +0100 <mauke> @src ReaderT
2023-03-16 23:15:39 +0100 <lambdabot> Source not found. I am sorry.
2023-03-16 23:15:42 +0100 <mauke> :-(
2023-03-16 23:15:53 +0100 <Ashkan> Ohhhh ... I see ... so it is essentially `Env -> IO a` . This is exactly like my case actually
2023-03-16 23:16:07 +0100 <mauke> https://hackage.haskell.org/package/transformers-0.6.1.0/docs/src/Control.Monad.Trans.Reader.html#…
2023-03-16 23:16:19 +0100 <andrew78> Sorry to interrupt but I think I've found the solution to my problem from earlier:
2023-03-16 23:16:19 +0100 <andrew78> ```
2023-03-16 23:16:20 +0100 <andrew78> g :: HasReader "name" Int m => m ()
2023-03-16 23:16:20 +0100 <andrew78> g = pure ()
2023-03-16 23:16:21 +0100 <andrew78> f :: HasState "name" Int m => m ()
2023-03-16 23:16:21 +0100 <andrew78> f = magnify @"name" @ReadStatePure @'[] g
2023-03-16 23:16:22 +0100 <andrew78> ```
2023-03-16 23:16:44 +0100 <mauke> pasting into IRC is not a good idea
2023-03-16 23:16:55 +0100 <davean> Ashkan: its *litterly* Env -> IO a
2023-03-16 23:17:03 +0100 <davean> infact, -> is a reader
2023-03-16 23:17:06 +0100 <mauke> lrtly
2023-03-16 23:17:21 +0100 <Ashkan> Yeah I see your point ...
2023-03-16 23:17:30 +0100 <Ashkan> Woow I can model a lot of stuff lie this:D
2023-03-16 23:17:35 +0100 <davean> https://hackage.haskell.org/package/mtl-2.3.1/docs/src/Control.Monad.Reader.Class.html#line-107
2023-03-16 23:17:42 +0100 <Ashkan> like* this
2023-03-16 23:17:44 +0100 <davean> Like seriously LITTERLY
2023-03-16 23:17:52 +0100 <mauke> *literally
2023-03-16 23:18:15 +0100 <mauke> yeah, (->) is the "naked reader" form
2023-03-16 23:18:22 +0100 <davean> Env -> IO a, is EXACTLY MonadReader Env ->
2023-03-16 23:18:24 +0100 <mauke> without the newtype wrapper
2023-03-16 23:18:46 +0100 <davean> So you can use it *directly*
2023-03-16 23:18:52 +0100 <mauke> but -> has no corresponding transformer form, which is what you need in your case to get "into" IO
2023-03-16 23:19:00 +0100 <mauke> hence ReaderT
2023-03-16 23:19:03 +0100 <davean> Right
2023-03-16 23:19:17 +0100zeenk(~zeenk@2a02:2f04:a307:2300::7fe) (Quit: Konversation terminated!)
2023-03-16 23:19:22 +0100 <Ashkan> Yeah, I'm seeing the light. Thanks guys. This really helps me.
2023-03-16 23:20:00 +0100 <davean> I think it helps to see thats the exact thing MonadReader is and every other form is a juggling to make some sort of ergonomics nicer
2023-03-16 23:21:03 +0100 <mauke> MonadReader is the general interface for all types that provide an environment of some sort
2023-03-16 23:21:28 +0100 <mauke> you could probably define a MonadReader instance for State
2023-03-16 23:23:20 +0100 <davean> mauke: eh ... it wouldn't really be lawful?
2023-03-16 23:24:43 +0100 <davean> I mean you can make the instance but I think it would be semanticly incorrect
2023-03-16 23:26:03 +0100Ashkan(~Ashkan@ec2-54-78-14-109.eu-west-1.compute.amazonaws.com) (Ping timeout: 260 seconds)
2023-03-16 23:26:13 +0100 <EvanR> andrew78, you can think of variables like m0 during type checking as an unknown by specific type, and the same rules apply as if it was a known specific type like Maybe
2023-03-16 23:26:22 +0100 <EvanR> unknown but specific*
2023-03-16 23:27:22 +0100 <EvanR> hypothetical types
2023-03-16 23:27:43 +0100 <EvanR> that the code is in an instance definition vs a normal function definition doesn't matter
2023-03-16 23:31:35 +0100andrew78(~andrew@2a01:4b00:d108:2500:36c8:5cfb:343b:f1f3) (Quit: Client closed)
2023-03-16 23:32:33 +0100freeside(~mengwong@122.11.248.245)
2023-03-16 23:36:21 +0100andrew86(~andrew@2a01:4b00:d108:2500:36c8:5cfb:343b:f1f3)
2023-03-16 23:37:15 +0100freeside(~mengwong@122.11.248.245) (Ping timeout: 256 seconds)
2023-03-16 23:40:19 +0100biberu(~biberu@user/biberu) (Read error: Connection reset by peer)
2023-03-16 23:42:18 +0100man_max(~man_max@94-43-231-47.dsl.utg.ge)
2023-03-16 23:43:18 +0100Ashkan(~Ashkan@ec2-54-78-14-109.eu-west-1.compute.amazonaws.com)
2023-03-16 23:43:18 +0100Tuplanolla(~Tuplanoll@91-159-68-152.elisa-laajakaista.fi)
2023-03-16 23:45:20 +0100biberu(~biberu@user/biberu)
2023-03-16 23:49:38 +0100yangby(~secret@183.128.104.108)
2023-03-16 23:49:39 +0100andrew86(~andrew@2a01:4b00:d108:2500:36c8:5cfb:343b:f1f3) (Quit: Client closed)
2023-03-16 23:50:45 +0100yangby(~secret@183.128.104.108) (Client Quit)
2023-03-16 23:58:48 +0100tromp(~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)